Борьба с Loop-функциями начального уровня в C - PullRequest
0 голосов
/ 15 октября 2019

Я не могу определить ошибку в моей логике, и я не могу точно определить, почему моя программа печатает числа, которые она делает. Задача состоит в том, чтобы создать программу, которая будет перечислять все простые числа от 1 до пользовательского ввода «n». Большое спасибо и, пожалуйста, скажите, если я неправильно форматировал этот вопрос.

#include <stdio.h>

void prime(int);
int main(void)
{
    int number;
    printf("Enter your n:\n");
    scanf("%d", &number);
    printf("Prime number(s) from 1 to %d : ", number);
    prime(number);

    return 0;
}
void prime(int n)
{
    int i, j, primecounter = 0;
    for (i = 0; i <= n; i += 1)
    {
        for (j = i; j > 0; j -= 1)
        {
            if (i % j == 0)
            {
                primecounter += 1;
                if (primecounter > 2)
                    continue;
            }
            printf("%d", i);
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

Это полный код, как решить вашу проблему.

#include <stdio.h>

void prime(int);
int main(void)
{
    int number;
    printf("Enter your n:\n");
    scanf("%d", &number);
    printf("Prime number(s) from 1 to %d : ", number);
    prime(number);

    return 0;
}
void prime(int n)
{
    int i, j;
    for (i = 0; i <= n; i += 1)
    {
        bool prime=true;
        for (j = i/2 /*changed it to i/2 for better performance*/; j > 1; j -= 1) //echo through the numbers
        {
            if (i % j == 0){prime=false;break;} //so long as there is a number that can be divided well, the FOR is broken out setting prime false 
        }
        if(prime)printf("%d\t",i); //prime is true only when there is NO number that can be divided well
    }
}
0 голосов
/ 15 октября 2019

Другой способ, которым вы могли бы воспользоваться для решения этого упражнения (лучше, я думаю), это изменить второй цикл for, чтобы начать проверку с i / 2 на 2 только для проверки только целых чисел, а затем добавить оператор if, который проверяет, является ли primecounterбольше нуля, чем его не простое число. и снова не забудьте инициализировать PrimeCounter на ноль после проверки каждого числа.

primecounter=0;
for (int j=i/2;i>=2;j--){
if (i%j==0)
 primecounter++;
}
if (primecounter)
      printf("%d \n",i);
}
0 голосов
/ 15 октября 2019

Ваша программа не может сбросить primecounter на 0 каждый раз, когда начинает тестировать новый i.

Если continue после if (primecounter > 2) не выполняется, printf после этоговыполняется в каждой итерации цикла с использованием j. Вы не хотите этого. Вы хотите печатать только после того, как цикл на j завершен, и только в том случае, если primecounter равен 2. (На самом деле он должен называться factorcounter, поскольку он учитывает факторы, а не простые числа.)

В printf используется "%d\n" вместо "%d", так что каждое число печатается в отдельной строке.

...