埃氏筛法原理
质因子分解结论
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int prime[maxn], pnum = 0;
bool p[maxn] = {0};
//素数筛选-埃氏筛法
void find_prime(){
for(int i = 2; i < maxn; i++){
//如果p[i]未被标记则是素数
if(p[i] == false){
//记录该素数
prime[pnum++] = i;
//将该素数的倍数的数字标记为不是素数
for(int j = i + i; j < maxn; j += i)
p[j] = true;
}
}
}
//质因子定义
struct factor{
int x;
int cnt;
}fac[11];
int main(){
int n, num = 0;
//生成素数表,方便后续使用
find_prime();
scanf("%d", &n);
//如果为1则直接输出
if(n == 1)
printf("1=1");
else{
printf("%d=", n);
//一个结论:对于一个正整数n来说,如果它存在[2,n]范围内的质因子
//要么这些质因子全部小于等于sqrt(n)
//要么只存在一个对于sqrt(n)的质因子,而其余质因子全部小于等于sqrt(n)
//所以此处至少需要判断到sqrt处
int sqr = (int)sqrt(1.0*n);
for(int i = 0; i < pnum && prime[i] <= sqr; i++){
//如果prime[i]是n的因子
if(n % prime[i] == 0){
//记录该因子
fac[num].x = prime[i];
fac[num].cnt = 0;
//计算该质因子prime[i]的个数
while(n % prime[i] == 0){
fac[num].cnt++;
n /= prime[i];
}
//不同质因子个数增加
num++;
}
//如果n提前为1则立即退出,节省时间
if(n == 1)
break;
}
//如果无法被根号n以内的质因子除尽
//则表示存在一个大于根号n的质因子,将其记录
if(n > 1){
fac[num].x = n;
fac[num++].cnt = 1;
}
//输出找到的质因子
for(int i = 0; i < num; i++){
if(i > 0)
printf("*");
printf("%d", fac[i].x);
if(fac[i].cnt > 1)
printf("^%d", fac[i].cnt);
}
}
return 0;
}
网友评论