【c语言学习笔记-翁恺】素数判断方法总结

通用main()函数部分

 #include<stdio.h> 
 int isPrime(int x);
 int main(){
 	int x;
 	scanf("%d",&x);
 	if (isPrime(x)){
	 	printf("%d is Prime",x);
	 }
	 else{
	 	printf("%d is not prime",x);
	 }
	 return 0;
 }

1.效率几乎最低

1.判断是否是偶数(x%2 == 0)
2.逐步递增i+=2(由于第1步排除了偶数部分,因此可以仅看奇数的部分),并求余,存在可以求余的部分,则判断其为素数
循环n/2遍

  int isPrime(int x){
  	int ret = 1;
  	int i;
  	if(x%2==0){
  	
 	 	ret = 0;
 	 }
 	else{
	 	for(i=3;i<x;i+=2){
	  	 	if(x%i==0){
	  		 	ret = 0;
	  		 	break;
	  		 }
	  	 }
		   }
  	
 	return ret;
  }

2.平方根求余

与1.相比,需要引用<math.h>,循环至x的平方根即可
由于x =sqrt(x) * sqrt(x)
所以任意的x = m * n,m或n<sqrt(x)
所以判断至平方根即可
循环sqr(x)遍

#include<stdio.h> 
 #include<math.h>
 int isPrime(int x);
 int main(){
 	int x;
 	scanf("%d",&x);
 	if (isPrime(x)){
	 	printf("%d is Prime",x);
	 }
	 else{
	 	printf("%d is not prime",x);
	 }
	 return 0;
 }
  int isPrime(int x){
  	int ret = 1;
  	int i;
  	if(x%2==0){
 	 	ret = 0;
 	 }
 	else{
	 	for(i=3;i<sqrt(x);i+=2){
	  	 	if(x%i==0){
	  		 	ret = 0;
	  		 	break;
	  		 }
	  	 }
		   }
  	
 	return ret;
  }

3.构造素数表【1.0】

【1.0】限定素数表的长度:最终生成的素数表最大值未知,但是素数表长度已知

更新isPrime函数
与前两个函数相比,主要的区别在于多了两个参数:
int knownprimes[] -->素数表
int numberofknownprimes -->素数表的长度
将输入的数(x)与素数表中的每个数(knownprimes[i])进行对比

  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;
  }

主函数
需要变量:

  1. 素数数组的长度(number)
  2. 初始数组 prime[number],并令初始素数数组为{2}
  3. 被判断是否是数组的数:i (与之前的判断不同,之前是scanf一个数字,以这个输入的数字一步步判断)
  4. 具体的更新过程,利用上述的isPrime函数,将i从3开始判断,与现有的数组进行对比
 int main(void){
 	const int number = 100;//素数表的长度
 	int count = 1;//下标,仅代表素数存储的位置
 	int prime[number] ={2}; 
 	int i = 3;//被判断的素数 
 	while(count<number){
	 	if(isPrime(i,prime,count)){
		 	prime[count++] = i; 
		 }
		 i++;
	 }
	 //打印素数表
	 for(i=0;i<number;i++){
	 	printf("%d",prime[i]);
	 	if((i+1)%5==0){
		 	printf("\n");
		 }
		 else{
		 	printf("\t");
		 }
	return 0;

举例来说:

第一次循环:i = 3 prime[] = {2,0,....} count = 2 prime[2]=3;(3仅与2对比)
第二次循环:i = 4 prime[] = {2,3,0,....},count = 2 ;(42对比后即结束循环)
第三次循环:i = 5 prime[] = {2,3,0,...},count = 3 prime[3]=5;(523对比之后被判断为素数,因此加入素数表)

截图来自翁恺老师

4.构建素数表【2.0】

不知道素数表长度,但是知道素数表内的最大的素数
素数表结构:

  1. 下标:被判断是否为素数的对象
  2. 元素:0或者1(0表示不是素数,1表示是素数)
 int main(){
 	const int maxnumber = 25;//素数表中所有的数均小于这个数
	int i;
	int x;//被判断为是否为素数的数 
	int isPrime[maxnumber];//原始数组 
	for(i=0;i<maxnumber;i++){
		isPrime[i] = 1;//先假设所有数均为素数 
	} 
	for(x=2;x<maxnumber;x++){//判断x是否为素数,注意!x从2开始判断 
		if(isPrime[x]){//2一定为素数,2的倍数均不为素数 
			for(i=2;i*x<maxnumber;i++){//令所有坐标为x的倍数的元素为0(即:不为素数),注意!i从2开始判断  
			isPrime[i*x] = 0;	
			}
			
		}
	}
	for(i=2;i<maxnumber;i++){
		if(isPrime[i]){
			printf("%d\t",i);
		}
	}
	return 0;
 } 

横轴为下标,纵坐标为x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值