c++笔记:秒解10亿以内素数及因式分解

最近在学c++,看到一种神奇的算法可以秒解10亿以内的所有素数,据说用了指针(还没学到,嘤),看不懂,姑且抄了下来,改吧改吧变成一个实现因式分解的程序

#include<stdio.h>
#include<memory.h>
#include<malloc.h>
#include<iostream>
#include<math.h>
#include<stdlib.h>
#define max 10000

using namespace std;

#define IDX(i)			((i)/2/sizeof(unsigned int))
#define OFF(i)			((i)/2%sizeof(unsigned int))
#define ISPRIME(i)		(isprimebits[IDX(i)]&(1UL<<OFF(i)))
#define CLEARPRIME(i)	(isprimebits[IDX(i)]&=~(1UL<<OFF(i)))

int main(){
	int n, i, j;
	cin >> n;
	unsigned int *isprimebits;

	isprimebits = (unsigned int *)
		malloc((IDX(n) + 1)*sizeof(unsigned int));

	memset(isprimebits, -1, (IDX(n) + 1)*sizeof(unsigned int));

	for (i = 3; i <= n / 2; i += 2){
		if (ISPRIME(i)){
			for (j = 3 * i; j <= n; j += 2 * i){
				CLEARPRIME(j);
			}
		}
	}
//以上就是求取n以内所有素数的方式,对于3到n以内的整形i,若i是素数ISPRIME(i)返回1,否则返回0

	int ss = 0;
	int s[max + 1] = { 0 };

	while (true){
		if (n % 2 == 0){
			s[ss] = 2;
			ss++;
			n = n / 2;
		}
		else{
			break;
		}
	}


	for (i = 3; i <= n / 2; i += 2){
		if (n%i == 0 && ISPRIME(i)){
			s[ss]=i;
			ss++;
			n = n / i;
			i = i - 2;
		}
	}

	if (ISPRIME(n)){
		s[ss]=n;
		ss++;
	}

	for (int q = 0; q < ss; q++){
		cout << s[q] << " ";
	}


	free(isprimebits);
	return 0;
}

输入100000000
解得 2 2 2 2 2 2 2 2 5 5 5 5 5 5 5 5

©️2020 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值