用C语言输出100到200之间的素数

这个错在哪里了?为什么输出的是100到200之间所有的奇数?
#include<stdio.h>
#include<math.h>
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;
}

应该是对素数的定义没有理解吧。

素数,是定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

简而言之,素数就是只能被1和它自己相乘得到的数。所以,除了1和它自己之外,它对其它数取余数,结果都不是0。

同时,无论什么数,除了它自己之外,最大的因数肯定是它的一半,所以只需要查找到它的一半就可以了,不必从1查找到它自己。而且,这里是找素数,如果它的因数包括它自己的一半与数字2的话,那它也不会是素数了,所以查找的界限定为比如 i/2 是不会有遗漏的。

至于你的原来的代码里为什么是它自己开平方,我数学记得不多了,不是太清楚。

然后,就是根据定义去判断一个数是不是素数,那么,就必须让它与从2到它的一半的所有的数的余数都不为0,反应到代码里就是不仅仅要 「i % n != 0」,而且还要全部能除的数都除一遍,也就是「 n == k」,这个时候,才能确定这个数是素数了。

#include <stdio.h>
#include <math.h>

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 的输出截图,可以说是很规整了!

如有帮助,烦请点采纳,谢谢!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-08-06
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是素数。
第2个回答  2019-03-11
#include<stdio.h>
#include<math.h>
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 ...

个人还是建议写成一个函数判断素数比较好

第3个回答  2019-03-19
思路:从100到200依次循环判断是否是素数,如果是素数则输出。
素数就是只能被1和本身整除的数。
参考代码:
#include
int fun(int n){//判断n是否是素数
int i;
if(n<2) return 0;
for(i=2;i
评论
0
0
加载更多
第4个回答  2019-03-11
程伟元序 高鹗序
相似回答