05-判断素数

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)

  1. 开辟prime[n],初始化其所有元素为1,prime[x]为1表示x是素数
  2. 令x为2
  3. 如果x是素数,则对于(i=2;xi<n;i++)令prime[ix]=0;
  4. 令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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值