我似乎无法识别逻辑中的错误,也无法查明程序为什么要打印其数字。分配是创建一个程序,该程序将列出从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);
}
}
}
答案 0 :(得分:0)
您的程序每次开始测试新的primecounter
时,都无法将i
重置为0。
如果未执行continue
之后的if (primecounter > 2)
,则在循环的每次迭代中使用printf
执行之后的j
。你不希望出现这种情况。您只想在j
上的循环完成后才打印,然后仅在primecounter
为2时才打印。(它应该真正地称为factorcounter
,因为它是考虑因素而不是素数。)
在printf
中,使用"%d\n"
而不是"%d"
,以便每个数字都打印在单独的行上。
答案 1 :(得分:0)
这是解决问题的完整代码。
#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
}
}
答案 2 :(得分:0)
解决此问题的另一种方法(更好的是,我认为)是将第二个for循环更改为从i / 2开始只检查2以便仅检查整数,然后添加一个if语句来检查primecounter是否为大于零,而不是非质数。同样不要忘记在检查完每个数字后将质数计数器初始化为零。
primecounter=0;
for (int j=i/2;i>=2;j--){
if (i%j==0)
primecounter++;
}
if (primecounter)
printf("%d \n",i);
}