#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;
}
质因子分解(素数埃氏筛法)[PAT A1059]
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 这个线性复杂度的欧拉素数筛法,爱了爱了 今天讲一下关于欧拉筛法的原理和代码实现,实不相瞒,我也才刚get到这个筛法...
- 问题:给出一个数n,输出1~n之间的素数 素数筛埃拉托斯特尼筛法每次消去的倍数,直到没有可消的为止,剩下的数字则为...