Не могу получить мой список, чтобы распечатать правильно с запятыми - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь заставить мою программу определить, является ли число простым, если это не так, затем перечислить, на что число делится на

#include <stdio.h>

int main()
{
    int n, i, j, k = 0, c = 0;

    printf("Enter an integer between 1 and 1000 (inclusive): \n");
    scanf("%d", &n);

    if (n > 1000 || n < 0) {
        printf("You must enter a number between 1 and 1000 (inclusive).\n");
    }
    else
    {
        for (i = 1; i <= n; i++)
        {
            if (n % i == 0) // check divisible number from 1 to n
            {
                c++; // count the divisible numbers
            }
        }
        if (c == 2) // c is 2 the number is prime
            printf("%d is prime.", n);
        else
        {
            printf("%d is divisible by ", n);
            for (i = 2; i <= 31; i++) // first 11 prime numbers
            {
                k = 0;
                for (j = 1; j <= i; j++)
                {
                    if (i % j == 0) //i=(2,3,7,11,13,17,19,23,31)
                    {
                        k++;
                    }
                }
                if (k == 2)
                {
                    if (n % i == 0) //if i prime number. n is divisible by i or not
                    printf("%d", i);
                    if (i < 5)
                    {
                        printf(", ");
                    }
                }
            }
            printf(".");
            printf("\n%d is not prime.\n", n);
        }
    }
    return 0;
}

В настоящее время, когда я ввожу 62, оно выводит

62 делится на 2, 31.

Но когда я попытаюсь изменить оператор if (i <3), он будет мешать другим типам печати, таким как попытка 468,распечатать </p>

468 делится на 2 313.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

Размещенный код сначала проверяет заданное число против каждого числа до самого себя, считая количество делителей, только чтобы определить, является ли оно простым.Если это не так, то он каким-то образом (с большим количеством магических чисел) пересчитывает эти факторы и пытается распечатать их в соответствии с запросом.

Было бы проще сначала вычислить простые числа (один раз) и список факторов,сохраняя их в некоторых массивах и только затем генерируя желаемый результат.

Вы можете получить тот же результат при расчете каждого фактора, отслеживая по крайней мере количество уже напечатанных факторов, если таковые имеются.

В этом случае я бы изменил алгоритм на что-то вроде этого

// The orignal number will be consumed, divided by all of its factor.
int m = n;
int count = 0;

// Start from 2, the first prime, up to the last number less or equal to the sqrt(m).
for (int i = 2; i * i <= m; ++i)
{
    // Check if what is left of the original number is divisible.
    if ( m % i  ==  0 ) 
    {                
        // Cunsume the number. E.g: 81 % 3 == 0  =>  81 -> 27 -> 3 -> 1
        //                          24 % 2 == 0  =>  24 -> 12 -> 6 -> 3
        do
        {
            m /= i;
        }
        while ( m != 1  &&  m % i == 0 );

        // Here, we can add the print logic and update the count of divisors
        if ( count == 0 )
        {
            printf("%d is divisible by %d", n, i);  // <- First factor
        }
        else
        {
            printf(", %d", i);                      // <- I-th factor
        }
        ++count;
    }  
}

if ( count == 0 )
{
    printf("%d is prime.\n", n);
}
else
{
    if ( m != 1 )
    {
        printf(", %d.\n", m);                      // <- Last prime factor
    }
    puts(". It's not prime.");  // or 'printf(".\n%d It's not prime.\n", n);' if you prefer
}

Тестируемый здесь .

0 голосов
/ 29 сентября 2019

следующий предложенный код:

  1. безупречная компиляция
  2. не проверяет ошибки ввода / вывода
  3. выполняет желаемую функциональность
  4. делаетиспользование функции массивов переменной длины в C

, а теперь предложенный код:

#include <stdio.h>

int main()
{
    int n, c = 0;

    do {
        printf("Enter an integer between 1 and 1000 (inclusive): \n");
        scanf("%d", &n);
    } while( n > 1000 || n < 0 );

    int divisors[n];

    divisors[ 0 ] = 0;
    divisors[ 1 ] = 0;

    for ( int i = 2; i < n; i++)
    {
        if (n % i == 0) 
        {
            divisors[ i ] = i;
            c++; // count the divisible numbers
        }
        else
            divisors[ i ] = 0;
    }

    if ( !c ) 
        printf("%d is prime.", n);

    else
    {
        printf("%d is divisible by ", n);
        for( int i = 0; i < n; i++ )
        {
            if( divisors[i] )
            {
                printf( "%d ", i );
            }
        }

        printf(".");
        printf("\n%d is not prime.\n", n);
    }
    return 0;
}

Следующие прогоны выполняются со значениями, предоставленными OP

Enter an integer between 1 and 1000 (inclusive): 
62
62 is divisible by 2 31 .
62 is not prime.

Enter an integer between 1 and 1000 (inclusive): 
468
468 is divisible by 2 3 4 6 9 12 13 18 26 36 39 52 78 117 156 234 .
468 is not prime.
0 голосов
/ 27 сентября 2019

Способ печати был проблемой.Он нашел 2 и распечатал 2,.Он нашел 3 и распечатал 3, затем он нашел 13 как последний делитель.Из этого вы получите 2, 313 в качестве вывода.

Я изменил деталь, когда число не простое:

        int first_divisor = 1;
        printf("%d is divisible by ", n);
        for (i = 2; i <= 31; i++) // first 11 prime numbers
        {
            k = 0;
            for (j = 1; j <= i; j++)
            {
                if (i % j == 0) //i=(2,3,7,11,13,17,19,23,31)
                {
                    k++;
                }
            }
            if ((k == 2) && (n % i == 0))
            {
                if (first_divisor == 0)
                {
                    printf(", ");
                }
                printf("%d", i);
                first_divisor = 0;
            }
        }
        printf(".");
        printf("\n%d is not prime.\n", n);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...