首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

自各儿写了个 打印100以内所有质数 ,求教

2013-10-18 
自己写了个 打印100以内所有质数 ,求教打印100以内质数,请帮我看看,错在哪,我打印出来是2-100,该怎么改,新

自己写了个 打印100以内所有质数 ,求教
打印100以内质数,请帮我看看,错在哪,我打印出来是2-100,该怎么改,新手在此感过!
int main()
{
int a,i,j;
    a=100;
    for(i=2;i<=100;i++)  //从2到100这些数中找质数
{
for(j=2;j<=a-1;j++)  
        {
if(i%j!=0)
break;
        } 
        printf("%d ",i);
    }
system("pause");
return 0;
}

[解决办法]
帮你稍微修改了下代码,楼主再对照看看


#include <stdio.h>
int main()
{
int a,i,j;

    
    for(i=2; i<100;i++)  //从2到100这些数中找质数
{
bool flag = true;
for(j = 2;j< i;j++)  
        {
if( (i%j) == 0)
{
flag = false;
break;
}
        } 
        if (i == 2 )
flag = true;
        if ( flag )
        printf("%d ",i);
    }
//system("pause");
return 0;
}


[解决办法]
楼主的内层循环
for(j=2;j<=a-1;j++)  
{
  if(i%j!=0)
  break;

根本就没起作用嘛,不管是个什么数,你跳出循环后都是打印此数,而且应该是i%j == 0 的时候跳出循环,
i%j == 0说明i可以被另一个数整除。
此题的正解如下:
#include <iostream>

using namespace std;

int main()
{
int flag = 0;
for(int i = 2; i < 100; i++)
{
flag = 0;
for(int j = 2; j < (i / 2); j++)
{
if(i % j == 0)
{
flag = 1;
break;
}
}
if(flag == 0)
print("%d ";i);
}
return 0;
}
[解决办法]
1   你的内层for没有用;if为真时break终止循环,跳出内层for,执行printf,然后执行i++,但是j一直是2;
    当if为假时,还是接着执行printf,再返回i++。这就相当于你只在循环外层for,然后依次输出
[解决办法]
哦   补充一点,写代码时,要有条理,楼主的代码感觉不很美观,注意一下,这样有了问题,就会很快找出来
[解决办法]
写一个,仅供参考:
int main(){
   int primes[30]={2,3};//
   int i,j,k=2;
   for(i= 5; i < 100; i += 2){
      for(j = 1; j < k && i % primes[j]; ++j);

      if(j == k)
           primes[ k++ ] = i;
   }
   printf("2..100 有 %d 个素数:\n",k);
   for(i = 0; i < k; i++)
      printf("%8d" , primes[i]);
    return 0;
}

[解决办法]
for(b=2;b<a;b++) //如判断数a是否为质数,需要从2至a-1都要除一遍
从数学上讲,只要从2 除到根号a
[解决办法]
只需要把printf语句换到if语句里面去就行了  楼主试一下
[解决办法]
引用:
这是我参照网友的思路写的,请大家看看我的理解对不对


#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,flag;
    flag=1;
    for(a=2;a<=100;a++) //从2-100中找质数
    {
for(b=2;b<a;b++) //如判断数a是否为质数,需要从2至a-1都要除一遍
{
if(a%b==0)
            {flag=0;break;} //如果结果为假,则跳出内循环,重新外循环        
        }
if(flag==1) //如果结果为真,则打印这个数
{
printf("%d ",a);
}
            else//否则就重新执行外层循环
flag=1;
    }
system("pause");
return 0;
}



for(b=2;b<a;b++) //如判断数a是否为质数,需要从2至a-1都要除一遍
可以换成 b<sqrt(a) 不过需要使用浮点数计算。
         b<a/2 也是可以的 


这种思想是 
如果 b*b == a
假如有一个素数 x>b且 x<a 使得 x*y =a
则必有大于1的数y = a/x < a/b =b;
那么 检查 a/ y 是否能够整除,就可以检查出 a/x 是否能够整除了。
  
至于 a/2 如果 a>4 则有a/2 >=2 
道理相同。
假如有一个素数 x>a/2 且 x<a 使得 x*y =a
那么必有   y = a /x <= a /(a /2)=2;
           只要 检查过a/2 是否能够整除, 就不必检查a/x ,是否能够整除了。
      


热点排行