C语言基础编程——素数代码大全

注:普通版是最简单的写法,进阶版是 “函数+数组” 的形式,并且在判断x是否是素数的方式上if(x%i==0),其中的i的量进阶版比普通版量要少,这样一定程度上能减少时间复杂度。

1.输入一个数,判断它是否为素数

1.1普通版(07.16_1)

//输入一个整数,判断它是否为素数 
#include<stdio.h>
int main(void)
{
	int x;
	scanf("%d",&x);
	
	int i;
	int isprime=1;
	for(i=2;i<x;i++) {//判断进来的x是不是素数 
		if(x % i==0) {
			isprime=0;
			break;
		}
	}
	if(isprime==0 || x==1) {
		printf("%d不是素数\n",x);
	} else {
		printf("%d是素数\n",x);
	}
	return 0; 
 }  

1.2进阶版(07.15_1)

//输入一个数x,判断它是否为素数 
//思路:先排除0,1以及2(不含2)以上的整数 
#include<stdio.h> 
#include<math.h>
int isprime(int x);
int main(void)
{
	int x;
	scanf("%d",&x);
	if(isprime(x)){
		printf("%d是素数",x);
	} else {
		printf("%d不是素数",x);
	}
	return 0;
 } 
 
int isprime(int x)
{
	int ret=1;
	int i;
	double size=sqrt(x);//小套路,再循环中尽量直接给值,不要给计算公式,这样能减少计算量 
	if(x==1 || (x!=2 && x%2==0)) ret=0;//0,1和2以上(不含2)的整数都不是素数。 
	for(i=3;i<size;i++) {
		if(x%i==0) {
			ret=0;
			break;
		}
	}
	return ret;
 } 

2.输出x以内的素数

2.1普通版(07.16_3)

//输出100以内的素数
#include<stdio.h>
int main(void)
{
	int i;
	for(i=1;i<100;i++) {
		int k;
		int isprime=1;
		for(k=2;k<i;k++) {//判断进来的i是不是素数 
			if(i%k==0) {
				isprime=0;
				break;
			}
		}
		if(isprime==1 && i!=1) {
			printf("%d是素数\n",i); 
		}
	}
	return 0;
}

2.2进阶版(07.15_3)

//构造n以内(不含)的素数表
//思路:见下面伪代码。
//(1)开辟prime[n],初始化其所有元素为1,prime[x]为1表示数x是素数;
//(2)令x=2;
//(3)若果x是素数,则对于(i=2;i*x<n;i++)令prime[i*x]=0,即把一个素数的倍数的数全部标记为非素数 
//(4) 令x++,若x<n,重复(3),否则结束。 
#include<stdio.h>
int main(void)
{
	const int n=100;
	int i;
	int isprime[n];
	for(i=0;i<n;i++) {//初始化数组,令其所有元素为1,数组中元素为1表示这个数i为素数 ,否则不为。 
		isprime[i]=1;
	}
	
//	//for test
//	printf("\t");
//	for(i=2;i<n;i++) {
//		printf("%d\t",i);
//	}
//	printf("\n");
//	//for test
//	
	int x;//x表示n以内中的素数,所以起始值为2. 
	for(x=2;x<n;x++) {
		if(isprime[x]) {//在循环中,得以判断每个数是不是素数,然后标记素数的整数倍为非素数。 
			for(i=2;i*x<n;i++){
				isprime[i*x]=0;//把  素数的x的整数倍  的那些数 标记为非素数。若目前不是x的整数倍,则先默认它为素数,直到便利到n-1时就能得知它是否真的是素数了 
			}
		}
		
//		//for test
//		printf("%d\t",x);
//		for(i=2;i<n;i++) {
//			printf("%d\t",isprime[i]);
//		}
//		printf("\n");
//		//for test
		
	}

	for(i=2;i<n;i++) {
		if(isprime[i])//若isprime[i]=1,则i为素数;否则不是。 
		printf("%d\t",i);//输出那些素数。 
	}
	printf("\n");
	return 0;
}

3.输出前n个素数

3.1普通版(07.16_4)

//输出前50个素数
#include<stdio.h>
int main(void)
{
	int cnt=0;
	int x;
	for(x=2;cnt<100;x++) {//揣摩这种for循环条件的写法 
	                     //因为cnt从0开始计数,所以不能挂等于 
		int i;
		int isprime=1;
		for(i=2;i<x;i++) {//判断进来的x是不是素数 
			if(x%i==0) {
				isprime=0;
				break;
			}
		}
		if(isprime==1) {
			cnt++;
			if(cnt%5==0) printf("%d\n",x);
			else printf("%d\t",x);
		}
	}
	return 0;
 } 

3.2进阶版(07.15_2)

//求出前number个素数(按大小),把他们放在数组中,然后遍历,输出 
//思路:定义一个数组,从小到大判断数是否是素数,是的话就放入这个数组,
//然后通过判断是否能被  已知的  小于x的  并且已在数组中  的素数 整除,来确定这个数是否为素数
//注:数组中已经初始化了几个易得知的素数,见line 10; 
//当然不初始化该数组也没问题,但是i要从2开始,因为1不是素数,从1开始没意义。 
#include<stdio.h>
int isprime(int x, int knownprimes[], int numberofknownprimes);
int main(void)
{
	const int number=100;
	int prime[number]={2,3};//数组中的前两个已经初始化了所以下面i从5开始 
	int count=2;
	int i=5;//前两个素数已经初始化了 
	
//	//for test 
//	{//这个大括号和下面那个大括号都是用来调试时看变量输出情况的。上面这个作用是输出个表头 
//		int i;
//		printf("\t\t");
//		for(i=0;i<number;i++) {
//			printf("%d\t",i);
//		}
//		printf("\n");
//	}
//	//for test
	
	while(count<number) {//通过这个循环把前10个素数填在定义的数组当中 
		if(isprime(i,prime,count)) {//  数组  在函数中的 传值方式 的写法 
			prime[count++]=i;//这一句就是用来把素数依此添加到定义好的数组中 
		}
		
//		//for test
//		{//这个大括号和上面那个大括号是用来调试时看输出情况的 
//			printf("i=%d \tcnt=%d\t",i,count);
//			{
//				int i;
//				for(i=0;i<number;i++) {
//					printf("%d\t",prime[i]);
//				}
//				printf("\n");
//			}
//		 } 
//		 //for test
		 
		i++;//i每次都会递增,但count只有符合条件时,即i为素数时才会递增 
	}
	for(i=0;i<number;i++) {//遍历数组,把上面加到数组中的素数输出出来 
		printf("%d",prime[i]);
		if((i+1)%5) printf("\t");
		else printf("\n");
	}
	return 0;
}
int isprime(int x, int knownprimes[], int numberofknownprimes)
{
	int ret=1;
	int i;
	for(i=0;i<numberofknownprimes;i++) {//主函数中每一次循环都要调用这个函数,所以传入这个函数中值(i,prime,count)都是不断变化的,即x,knownprimes[],numberofknownprimes不断变化 
		if(x % knownprimes[i]==0) {//通过判断是否能被已知的并且小于x的素数整除,来确定这个数是否为素数 
			ret=0;
			break;
		}
	}
	return ret;
}

4.输出[m,n]区间内的素数,并求和(07.16_2)

//输出[m,n]区间内的素数,个数,并求和 
#include<stdio.h>
int main(void)
{
	int m,n;
	scanf("%d %d",&m,&n);
	if(m==1) m=2;
	int cnt=0;
	int sum=0;
	int i;
	for(i=m;i<=n;i++) {
		int isprime=1;
		int k;
		for(k=2;k<i;k++) {//判断段进来的i是不是素数 
			if(i % k==0) {
				isprime=0;
				break;
			}
		}
		if(isprime==1) {
			printf("%d是素数\n",i);
			cnt++;
			sum+=i;
		}
	}
	printf("\n");
	printf("%d个素数,和为 %d\n",cnt,sum);
	return 0;
 } 

 

  • 16
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值