读书人

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

发布时间: 2013-10-18 20:53:13 作者: rapoo

自己写了个 打印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 ,是否能够整除了。



读书人网 >C++

热点推荐