注册 登录
编程论坛 C图形专区

求一个数是否为素数,代码写好了,感觉好像没错,但实际上没结果的

love云彩 发布于 2012-12-20 14:05, 773 次点击
#include<stdio.h>
int main()
{
    int i,j,a=0;
    for(i=3;i<=10;i++)
    {
        for(j=2;j<=i-1;j++)
        {
            if(i%j!=0)
                a=i;
            if(i%j==0)
                break;
        }
          printf("%6d",a);
    }     
        return 0;
}
不知道能不能用这样的方法来判断一个数为素数,我的基本思路是先外部循环,i=3往内部循环送去,然后在里面循环i-1次,每一次内部循环都用if语句来判断,若正确则i值赋给a;若不正确,则退出,若正确的话,继续j++;直到i-1次,但输出的时候却是“3 3 5 5 7 7 9 9请按任何键继续……”,分析不出哪里除了问题

[ 本帖最后由 love云彩 于 2012-12-20 22:26 编辑 ]
10 回复
#2
crystall2012-12-21 10:07
程序代码:

这个方法当然可以了,需要加个变量判断一下。

素数:只能被1和自己整除。
你这个答案输出9, 9根本就不是素数。
为什么会出现这样呢?
当 i = 9时, j = 2, i % j != 0,此时a = 9.
那么它还会继续下一轮循环, j = 3, i % j == 0 此时退出循环,打印a.

关于为什么会输出 3 3 5 5....
那是因为,第一次判断3是否为素数,为素数 a = 3, 打印a.
          第二次判断4是否为素数,不为素数, 退出循环。 此时a的值还是为3,没有被重新赋值,因此又打印了一次3,后面的5 5 同样的道理。

#include<stdio.h>
int main()
{
    int i,j,a=0;
    bool isPrimeNum = false;
   
    for(i = 3; i<= 100; i++)
    {
        for(j = 2;j < i;j++)
        {
            if(i%j != 0)
            {
                a=i;
                isPrimeNum = true;
            }
            else
            {
                isPrimeNum = false;
                break;
            }
        }
      
        if(isPrimeNum == true)
        {
            printf("%d\r\n",a);
        }
    }   
    return 0;
}
#3
wkz20122012-12-21 10:55
楼上正解,只要是奇数就会被打印
#4
SPWENG2012-12-21 10:58
#include<stdio.h>

int main()
{
    int i,j,b;
    printf("%3d",2);   
    for(i=3;i<=100;i+=2)
    {
        b=1;
        for(j=3;j*j<=i;j+=2)
            if(i%j==0)
            {
                b=0;
                break;
            }      
        if(b)        
            printf("%3d",i);        
    }
    printf("\n");
    return 0;
}
#5
SPWENG2012-12-21 10:59
#include<stdio.h>

int main()
{
    int i,j,b;
    printf("%3d",2);   
    for(i=3;i<=100;i+=2)
    {
        b=1;
        for(j=3;j*j<=i;j+=2)
            if(i%j==0)
            {
                b=0;
                break;
            }      
        if(b)        
            printf("%3d",i);        
    }
    printf("\n");
    return 0;
}
#6
qunxingw2012-12-21 11:18
除了1和本身的问题,楼主是不是还有别的隐患。稍扩大i范围,判断15会咋样?
#7
w5277050902012-12-21 15:48
看来楼主的代码还是有很多的问题,提出来了就好自己思考思考。
#8
dyh8399110102012-12-21 21:04
2楼正解,不过我没学C++,对于true和false的用法不熟。
#9
crystall2012-12-22 11:47
回复 8楼 dyh839911010
并不是一定要用bool类型的, 用int 类型也可以啊, 只是在这种场合习惯了用bool型.
#10
conan87322013-01-11 15:23
主要是这个判断
if(i%j!=0)
i=10 j=3
该成if(j==i-1)
#11
yuyilahanbao2013-02-19 22:12
程序代码:
#include<stdio.h>
int main()
{
    int i,j;
    for(i=3;i<=10;i++)
    {
        for(j=2;j<=i-1;j++)
        {
            if(i%j==0)
                break;
        }
    if (j==i)      printf("%6d",i);
    }   
        return 0;
}
加上红色的这个判断语句
因为这个条件为真的话,说明没有执行break;语句,正常退出,即i代表的数不是任何数的倍数(当然除1了),是质数,输出
同时我删除了a这个变量,及其与之相关的            
if(i%j!=0)
  a=i;
因为没必要,程序在保证可读性时,要尽量少使用变量
1