素数_埃拉托色尼筛法_交换变量的值_紧凑存放

本文介绍了三种判断素数的方法:穷举法、简化后的穷举法和埃拉托色尼筛法,并提供了每种方法的C语言实现代码。通过这些方法可以高效地判断一个数是否为素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、
素数:除了1和它本身以外,不能被任何整数整除的数。例如 17就是素数,因为它不能被2~16的任一整数整除。因此判断一个整数m是否是素数,只需把m被2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数


问:为什么 1 不是素数?

答:整数有一个性质,就是分解质因数的唯一性,即把一个大于1的整数分解质因数,他的形式是唯一的 比如12=2²*3        18=2*3²
而如果1是素数,则分解的形式就唯一的了,因为可以若干个1相乘。所以规定1不是素数

1、穷举法:

简化:m不必呗2~m-1之间的每一个整数去除,只需被2~√m之间的每一个整数去除就可以了。

#include <stdio.h>
#include <math.h>
int main(){
	int m,i,k,flag;
	printf("set m:");
	scanf("%d",&m);
    k=sqrt(m);
	for(i=2;i<=k;i++){ 
		if(m%i==0){
			flag = 0;
			break;
		}else
			flag = 1;
	}
	if(flag==0||m==1){
		printf("no");
	}else{
		printf("yes");
	}
	return 0;
} 

2、埃拉托色尼筛法

基本思路:给定候选内容,然后逐步用条件去判断某个候选者是否符合要求,将不符合的去掉,不断重复判断与删除的步骤,最后剩下的就是满足要求的内容。

判断素数:

  • 先将1删除 (1 不是素数)
  • 用2去除剩下的各个数,把能被2整除的数删除
  • 用3去除剩下的各个数,把能被3整除的数删除
  • ……
  • 一直到比候选者小1 的数去除剩下的数,把能整除的删掉
  • 剩下的全是素数

代码如下:

#include<stdio.h>
int main(){
	int n;
	printf("set n:");
	scanf("%d",&n);
	
	int i,j,d,nums[n],max;			//d: divisor
	// 将 1 ~ n 间的数作为候选
	for(i=0;i<n;i++){
		nums[i] = i + 1;
	} 
	
	nums[0] = -1;	//删去 1 
	//删除 2,3,4……的倍数 
	max = nums[n-1];
	for(d=2;d<max;d++){
		for(i=0;i<n;i++){
			if(nums[i]>d){
				if(nums[i]%d==0){
					nums[i] = -1;  //delete
				}
			}
		}
	}
	//show
	j = 0;
	printf("Prime nums between 1 and n");
	for(i=0;i<n;i++){
		if(nums[i]>0){
			if(j%10==0){
				printf("\n");				
			}
			printf("%5d",nums[i]);
			j++;
		}
	}
	return 0;
}

3、判断某一个数是否为素数 

#include<stdio.h>
int main(){
	int n,i,flag;
	printf("set n:");
	scanf("%d",&n);
	if(n<=1){
		printf("no");
	}else{
		for(i=2;i<n;i++){
			if(n%i==0){
				flag = 0;
				break;
			}else{
				flag = 1;
			}
		}
		if(flag==1){
			printf("yes");
		}else{
			printf("no");
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值