应该是对素数的定义没有理解吧。
素数,是定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
简而言之,素数就是只能被1和它自己相乘得到的数。所以,除了1和它自己之外,它对其它数取余数,结果都不是0。
同时,无论什么数,除了它自己之外,最大的因数肯定是它的一半,所以只需要查找到它的一半就可以了,不必从1查找到它自己。而且,这里是找素数,如果它的因数包括它自己的一半与数字2的话,那它也不会是素数了,所以查找的界限定为比如 i/2 是不会有遗漏的。
至于你的原来的代码里为什么是它自己开平方,我数学记得不多了,不是太清楚。
然后,就是根据定义去判断一个数是不是素数,那么,就必须让它与从2到它的一半的所有的数的余数都不为0,反应到代码里就是不仅仅要 「i % n != 0」,而且还要全部能除的数都除一遍,也就是「 n == k」,这个时候,才能确定这个数是素数了。
#include
#include
int main()
{
int i, k, n, m = 0;
for (i = 101; i <= 200; i = i + 2)
{
k = i / 2; // 被除的数,小于等于它的一半
for (n = 2; n <= k; n++)
{
if (i % n == 0)
break;
else if (n == k) // 要把从2到k的数都除一遍才能确定
{
printf("%8d", i);
m++;
if (0 == m % 10) //把这个if输出换行放到else if里面来,要不然后面会多很多空行
printf("\n");
}
}
}
printf("\n");
return 0;
}
输出截图:
还有一张是把 i 的初始值改为 3 的输出截图,可以说是很规整了!
如有帮助,烦请点采纳,谢谢!
bool
shs(const
int
A)
{//判断A是否为质数,是的话返回true.
if((A==2)||(A==3))
return
true;
if(A<=1)
return
false;
int
a;
for(a=2;a<=sqrt(A)+1;a++)
{
if(A%a
==
0)
return
false;
if(a
==
sqrt(A)+1)
return
true;
}
}
1不是素数,2和3是素数,如果一个整数A,能被2到根号下A之间的整数整除,那么A不是素数,反之A是素数。
#include
#include
int main()
{
int i,k,n,m=0;
for(i=101;i<=200;i=i+2)
{
k=sqrt(i);
for(n=2;n<=k;n++)
if(i%n==0)break;
else
{
printf("%8d",i);
m=m+1;
}
if(m%10==0)printf("\n");
}
return 0;
}
代码要有缩进!代码要有缩进!代码要有缩进!
问题在里面那个循环。里面循环的目的显然是验证所有n是否都不能整除,如果有一个能整除就跳出循环(到下一个i)。但是你这样写不是这个意思,这样写的话,else语句是跟着if的,所以验证到任何一个不满足整除就会输出,而不是所有。比方说i是105,验证n=2,if不成立,就会走下面输出的语句。
解决方法是立flag(没错你没听错……立flag就是这里来的)
int flag = 0;
for (n = 2; n <= k; n++) {
if (i % n == 0) {
flag = 1;
break;
}
}
if (!flag) // !flag相当于flag != 0
printf ...
个人还是建议写成一个函数判断素数比较好
思路:从100到200依次循环判断是否是素数,如果是素数则输出。
素数就是只能被1和本身整除的数。
参考代码:
#include
int fun(int n){//判断n是否是素数
int i;
if(n<2) return 0;
for(i=2;i
评论
0
0
加载更多
程伟元序 高鹗序