首页 > 用户发贴区 > 编程问题提问区 > 求素数的问题
2008
08-20

求1—100间素数,为什么我这样写就求不出来呢,哪位大侠能给解释下。。谢谢~~


#include<stdio.h>
void main()
{
 int a[101],i,j;
 for(i=1;i<101;i++)
 {
  a[i]=1;
 }
 for(i=1;i<=100;i++)
 {
  for(j=2;j<i;j++)
  {
   if(i%j==0)
   {
    a[i]=0;break;
   }
  }
 }
 for(i=1;i<=100;i++)
 {
  if(a[i]=1)
   printf(“%d “,i);


 }


}


求素数的问题》有 10 条评论

  1. TONYAZITEN 说:

    看的我挺头疼 我写了一个 你参考一下

    #include “stdio.h”

    int is_prime(int n);

    void main()
    {
     int n;
     
     printf(“please input an integar: “);
     scanf(“%d”,&n);
     if (is_prime(n)==1)
     printf(“%d is a prime\n”,n);
     else
     printf(“%d is not a prime\n”,n);
    }

    int is_prime(int n)
    {
     int k=2,m;
     
     if (n==2)
     m=1;
     else
     {while(k<n)
     {if (n%k!=0)
      {++k;m=1;}
      else
      {m=0;break;}
     }
     }
     return(m);
    }

     

  2. mhjerry 说:

    大哥呀,你把倒数弟三行的if(a[i]=1)给我去掉就能输出结果了,如下,可能是你的意思,是素数的为1,不是的为0。

    1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1
    0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 Press any key to continue

    最后一个for仅仅是输出数组,不需要在家条件。

    但我搞不懂你第一个for干嘛把所有数都搞成1,你把a[i]=1;换成a[i]=i;会更好!

    1 2 3 0 5 0 7 0 0 0 11 0 13 0 0 0 17 0 19 0 0 0 23 0 0 0 0 0 29 0 31 0 0 0 0 0 37 0 0 0 41 0 43 0 0 0 47 0 0 0 0 0 53 0 0 0 0 0 59 0 61 0 0 0
    0 0 67 0 0 0 71 0 73 0 0 0 0 0 79 0 0 0 83 0 0 0 0 0 89 0 0 0 0 0 0 0 97 0 0 0 Press any key to continue

  3. magicstar 说:

    [QUOTE=mhjerry]

    大哥呀,你把倒数弟三行的if(a[i]=1)给我去掉就能输出结果了,如下,可能是你的意思,是素数的为1,不是的为0。

    1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1
    0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 Press any key to continue

    最后一个for仅仅是输出数组,不需要在家条件。

    但我搞不懂你第一个for干嘛把所有数都搞成1,你把a[i]=1;换成a[i]=i;会更好!

    1 2 3 0 5 0 7 0 0 0 11 0 13 0 0 0 17 0 19 0 0 0 23 0 0 0 0 0 29 0 31 0 0 0 0 0 37 0 0 0 41 0 43 0 0 0 47 0 0 0 0 0 53 0 0 0 0 0 59 0 61 0 0 0
    0 0 67 0 0 0 71 0 73 0 0 0 0 0 79 0 0 0 83 0 0 0 0 0 89 0 0 0 0 0 0 0 97 0 0 0 Press any key to continue

    [/QUOTE]

    倒数第三行的if不能去掉,前面的for循环是标记不是素数的数,所以必须用if。突然发现原来那个if里面应该是if(a[i]==1),哎,我少打了个=好,实在惭愧。。

  4. mhjerry 说:

    那不好意思,没明白你的意思!

  5. sunnyhuang2008 说:

    2楼….人家好像是求100内的素数..不是求某个数是不是素数吖….

  6. TONYAZITEN 说:

    [QUOTE=sunnyhuang2008]2楼….人家好像是求100内的素数..不是求某个数是不是素数吖….[/QUOTE]

    …算法一样的么,用is_prime()把100以内的数过一遍不就行了么…

  7. m13554550158 说:

    我有个思路 就是用if语句    和 i++    先判断这个数是不是只能被1和他本身整除   或者用大于2的数都除2  看能不能整除      如果能就不是素数   然后慢慢整理思路去改变

  8. bowen 说:

    只要遍历到sqrt(100)就行了。

    for(i=3;i<100;i++)

       for(j=1;j<sqrt(i);j++)

    {

    if(n%i=0)

    continue;

    printf(“%-4d”,j);

    }

     

  9. bowen 说:

    只要遍历到sqrt(n)就行了。

    for(i=3;i<100;i++)

       for(j=1;j<sqrt(i);j++)

    {

    if(i%j=0)

    continue;

    printf(“%-4d”,j);

    }

    上面错了。

  10. xcgang 说:

    直接用算出来的前面的素数来验证后续的是否是素数,这样程序

    时间代价是很小的,

    另外,sqrt本身是一个浪费时间的操作(从算法的角度,不是机器

    时间)。

    main()

    {

       int a[100];

       int i,j,pos ;

       //a[0]= 2;

       pos = -1 ;

       for (i=1 ;i<101;i++)

       {

          for(j=0;j<=pos;j++)

          {

             if (i%a[j]==0)

                break;

          }

          if (j>pos)

             a[pos++] = i ;

       }

       for (i=0 ;i<pos; i++)

          printf(“%d  ”, a[i]);

       getchar();

    }

留下一个回复