#include<iostream>
#include<math.h>
int main(){
int i,j,n,a[101];
for(i=1;i<=100;i++)
a[i]=i;
a[1]=0;//1不是素数
for(i=2;i<sqrt(100.0);i++)//此处为求素数算法,后面讲
for(j=i+1;j<=100;j++)
{
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)//能被整除,则不是素数,设置为0
a[j]=0;
}
printf("\n");
for(i=2,n=0;i<=100;i++)
{
if(a[i]!=0)//这里是a[i],是因为已经是新的循环了,跟j无关
{
printf("%5d",a[i]);
n++;
}
if(n==10)//n为控制换行的计数器,每十个换行。
{
printf("\n");
n=0;
}
}
printf("\n");
system("pause");
return 0;
}
讲一下求素数的算法,以n为例,最简单的是从2-n/2枚举,如果n能被整除其中一个整除,就不是素数。这个方法简单却没有效率。
1-100的数中,任意取一个数,如果是非素数,都可以认为是(2-10)取一个数乘以一个小于50的数字,因为>=10 后,与另一个数字相乘要<=100 就必须另一个数字<=10,所以只要测试这个数字能否被2-10整除就可以了这样就比上面一种方法测试次数少。
当然这也不是最简单的算法,这里介绍另一种。
for(i=3;i<=100;i++)
if(i%2==0)//没必要判断2以外的偶数
a[i]=0;
else
a[i]=i;
a[1]=0;
a[2]=2;
for(i=3;i<=100;i+=2)//从3开始,判断奇数即可
for(j=3;j<=sqrt(i);j+=2)
//因为不用检测偶数,所以没必要让j从2开始,也没必要为偶数,因此j+=2
if(i%j==0)
a[i]=0;
这算法和上面方法相同,但反了一反,效果却差很多,不必从2-10都测试一遍,任意一个数都只要判断自己的平方根次就可以了,(因为一个数若能拆成2个整数相乘,其中一个必定<=自身平方根,另一个>=平方根),不必去测试额外的次数,对于大数据量十分有效。
编程的时候把缩进调整好,容易查看,你的缩进不好,程序结构层次不清,就容易造成误会,把后面的a[i]认为仍然是 for(j=i+1;j<=100;j++)这个循环中了