素数:又称质数,指在一个大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数。素数的因数只有1和它本身。
**
一,第一种求法:确定性求法(简称常规求法),效率较低。
**
#include<stdio.h>
#include<time.h>
int isPrime(int n)//判断数n是否为素数
{
if(n<=1)
{
return 0;
}
int i;
for(i=2;i*i<=n;i++)//只需要求2到根号n是否有n的因子即可。
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
clock_t startTime,endTime;//计算时间差用的
startTime=clock();
int input=0,flag=0,count=0;
printf("please input a number:\n");
scanf("%d",&input);
int i;
for(i=2;i<input;i++)
{
if(isPrime(i))
{
printf("%4d ",i);
++flag;
++count;
if(flag==10)
{
printf("\n");
flag=0;
}
}
}
printf("\nthe number of primes is:%d.\n",count);//主要代码段(结束)
endTime=clock();
printf("use time:%f",(double)(endTime-startTime)/1000);
return 0;
}
二,第二种求法:Eratosthenes算法(简称素数表法)
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<time.h>
int main()
{
clock_t startTime,endTime;//计算时间差用的
startTime=clock();
int input=0;//主要代码段(开始)
scanf("%d",&input);
if(!(input>INT_MIN && input<INT_MAX))//int所能表示的十进制最大值和最小值
{
printf("out of int range!");
exit(0);
}
int *prime;
prime=(int*)malloc(input*sizeof(int));//开辟动态数组
int i;
for(i=0;i<input;i++)
{
prime[i]=1;//数组初始化全部赋值为1
}
int j;
for(j=2;j*j<input;j++)//将2到根号n之间的所有素数的倍数全部赋值为0,剩下的就是素数了。
{
if(prime[j]==1)
{
int a;
for(a=2*j;a<input;a++)
{
if(a%j==0)
{
prime[a]=0;
}
}
}
}
int b,flag=0,count=0;
for(b=2;b<input;b++)
{
if(prime[b]==1)
{
printf("%-4d ",b);//输出每一个素数占4位,不够向左靠齐。
++flag;
++count;
if(flag==10)
{
printf("\n");
flag=0;
}
}
}
printf("\nthe number of prime is:%d\n",count);
free(prime);//主要代码段(结束)
endTime=clock();
printf("use time:%lf seconds\n",(double)(endTime-startTime)/1000);
return 0;
}
待续。。。