素数求法_辗转相除法

素数的快速筛选法

  • 废话不多说,都在代码里了;
#include<iostream>

using std::cout;
using std::endl;
using std::cin;


// 获取一个数组 其第 i 位上存储着从小到大的 第i 大的素数; 
// max_area 从 2 到 max_area 中所有的素数 数组 ;
// total 这个范围内 素数的个数;
int* getPrime(int max_area,int* total) {
	int* primes = nullptr;
		primes = (int*)realloc(primes, (sizeof(int)*(max_area+9)>>1));
	bool* isPrime = (bool*)malloc(sizeof(bool)*(max_area+9));
	memset(isPrime, 1, sizeof(isPrime));
	int count = 0;
	for (int i = 2; i < max_area; i++) {
		if (isPrime[i]) {
			primes[count++] = i;
		}
		for (int j = i + i; j < max_area; j += i) {
			isPrime[j] = 0; // 0 表示j 不是 素数
		}
	}
	*total = count;
	return primes;
}

// 素数 判断 
// prime[] 用来保存的到的素数 ;
// total 当前得到素数的个数 ;
// check[i] 表示 i 这个数是不是素数;
int main() {
	int max_area = 0;
	cin >> max_area;
	int total = 0;
	int* primes = getPrime(max_area,&total);
	system("cls");
	for (int i = 0; i < total; i++) {
		cout << *(primes + i) << endl;
	}
	free(primes);
	primes = nullptr;
	return 0;
}


// 最大公约数(欧几里得辗转相除法)
//原理: gcd(a,b)=gcd(b,a mod b)
// 当b为0时,两数的最大公约数即为a
int gcd(int a,int b){
	return b == 0 ? a : gcd(b,a%b);
}

// 由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积
int minSum(int a,int b){
	int ans = 0;
	ans = a*b/gcd(a,b);
	return ans;
}


  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值