第一个问题的分析:如果满足i<=k,则说明这个数不是素数,则不用输出,不执行下面的printf的函数,只有满足i>=k+1(其实是满足1=k+1),才能判断此数为素数,则输出。所以程序是正确的。
第二个问题的分析:两个程序的最终结果是一样的,都是正确的。
程序自然结束后,会有i==k+1,此时是素数,打印数字;而如果是break出循环,则假设不成立,为合数,不打印字符,执行下一次循环。
扩展资料:
如果 为合数,因为任何一个合数都可以分解为几个素数的积;而N和N+1的最大公约数是1,所以不可能被p1,p2,……,pn整除,所以该合数分解得到的素因数肯定不在假设的素数集合中。因此无论该数是素数还是合数,都意味着在假设的有限个素数之外还存在着其他素数。所以原先的假设不成立。也就是说,素数有无穷多个。
参考资料来源:百度百科-质数
1. 注意 if(i>=k+1) 不在 for(i=2;i<=k;i++) 循环中,
for(i=2;i<=k;i++)
if(m%i==0)
break;
if(i>=k+1)
{
printf("%4d",m);
n=n+1;
}
当 for(i=2;i<=k;i++) 没有被 break 打断退出,那么 i 在退出循环的值为 k+1 此时 if(i>=k+1) 为真,其实 if(i>=k+1) 就是为了判断 m 是否是素数。
2 第二种写法比较对,我们先看第一种
if(i>=k+1)
{
printf("%4d",m);
n=n+1;
}
if(n%10==0)
printf("\n");
当某次循环进入 if(i>=k+1),输出了10个素数,使得n=10,进入 if(n%10==0)打印换行符;
下次循环没有进入 if(i>=k+1),但此时n还是为10,又进入了 if(n%10==0)打印换行符,此时打印多一个换行符。
1. 先说:for(i=2;i<=k;i++) ,当循环正常结束时,也就是说从2到k,逐个都验证了,没强行跳出,说明没打到因数。此时,i=k+1,所以才有判断if(i>=k+1)。
2.第2种对,因为for(i=2;i<=k;i++) ,当循环正常结束时, if(i>=k+1)时才应有输出,也才涉及到是否达到10的倍数个,第1种当前素数后面紧跟的数不是素数时n的值不变,也会输出换行,会多输出换行的,虽然也是每行10个素数,但会有空白行,100-200之间素数恰好隔2个,看不出换行问题,扩大范围后就能看得出了。
有个小问题,建议改掉: k=sqrt(m);会警告,问题在于sqrt函数返回值类型要求是double型,k是整型,建议改为 k=(int)sqrt(m);
1.程序自然结束后,会有i==k+1,此时是素数,打印数字;而如果是break出循环,则假设不成立,为合数,不打印字符,执行下一次循环。
回答追问:无论被break打断还是自然执行,下一句执行的都是if语句,如果没有if,会输出所有值。
2.都正确,是为了判断是否够10个数,够的话执行换行
第一个问题的分析:如果满足i<=k,则说明这个数不是素数,则不用输出,不执行下面的printf的函数,只有满足i>=k+1(其实是满足1=k+1),才能判断此数为素数,则输出。所以程序是正确的。
第二个问题的分析:两个程序的最终结果是一样的,都是正确的。