1.输入一个数,判断这个数是不是素数,最最基础的方法,没加任何算法思想
#include <stdio.h>
int main()
{
int x; //input number
scanf("%d",&x);
int i;
int isPrime = 1; // it is a prime number when it eauqll to 1
for(i=2;i<x;i++){
if(x%i==0){
isPrime=0;
break;
}
}
if(isPrime==0){
printf("%d is not a prime number\n",x);
}else{
printf("%d is a prime number\n",x);
}
return 0;
}
题二: 求任意范围之间的素数和
#include <stdio.h>
int isPrime(int i)
{
int ret =1;
int k;
for(k=2;k<i-1;k++){
if(i%k==0){
ret=0;
break;
}
}
return ret;
}
int main()
{
int m,n;
int sum=0;
int cnt=0;
int i;
scanf("%d %d",&m,&n);
if(m==1)m=2;
for(i=m;i<=n;i++){
if(isPrime(i)){
sum+=i;
cnt++;
}
}
printf("the sum is %d ",sum);
}
题目三:算法改进,减少运算时间
1,偶数肯定不是素数,可以从三开始,每次循环都加二,避开了关于偶数的计算
int isPrime(int x)
{
int ret =1;
int i;
if(x==1||(x%2==0&&x!=2)){
ret=0;
}
for(i=3;i<x;i+=2){
if(x%i==0){
ret=0;
break;
}
}
return ret;
}
2.无需计算到x-1,到sqrt(x)就好了。属于数学推论。
int isPrime(int x)
{
int ret =1;
int i;
if(x==1||(x%2==0&&x!=2)){
ret=0;
}
for(i=3;i<sqrt(x);i+=2){//改进处
if(x%i==0){
ret=0;
break;
}
}
return ret;
}
3.再进一步改进,判断能否被整除时,也不用一个一个去跳,可以直接用比x小的素数去计算。
#include <stdio.h>
int isPrime(int x,int knownPrimes[],int numberOfKnownPrimes)
{
int ret =1;
int i;
for(i=0;i<numberOfKnownPrimes;i++){
if(x%knownPrimes[i]==0){
ret =0;
break;
}
}
return ret;
}
int main()
{
const int number = 10;
int prime[number];//构造一张素数表,里面存的都是素数,初始化为2,2是第一个素数
int j;
for(j=1;j<number;j++){
prime[j]=0;
}
int count =1;//素数表里面有一个元素了
int i=3;
while(count<number){
if(isPrime(i,prime,count)){
prime[count++]=i;//做了俩件事,i的值被放入了cnt所指向的数组,然后再加一,及指向了下一个空的数组。
}
// {
// printf("i=%d \tcnt=%d\t",i,count);
// int i;
// for(i=0;i<number;i++){
// printf("%d\t",prime[i]);
// }
// printf("\n");
// }
i++;
}
for(i=0;i<number;i++){
printf("%d",prime[i]);
if((i+1)%5)printf("\t");
else printf("\n");
}
return 0;
}
4.构造素数表,欲构造n以内的素数表(就是从低往高处走,如果一个素是素数了,那么它的2倍数,3倍数肯定就不是素数了,将其标记为0)
- 开辟prime[n],初始化其所有元素为1,prime[x]为1表示x是素数
- 令x为2
- 如果x是素数,则对于(i=2;xi<n;i++)令prime[ix]=0;
- 令x++,如果x<n,重复3,否则结束
测试代码:求25以内的素数
#include <stdio.h>
int main()
{
const int maxNumber = 25;
int isPrime[maxNumber];
int i;
int x;
for(i=0;i<maxNumber;i++){
isPrime[i]=1;//所有的值初始化为1
}
for(x=2;x<maxNumber;x++){
if(isPrime[x]){
for(i=2;i*x<maxNumber;i++){
isPrime[i*x]=0;
}
}
}
for(i=2;i<maxNumber;i++){
if(isPrime[i]){
printf("%d\t",i);
}
}
printf("\n");
return 0;
}