版权声明:假装有个原创声明……虽然少许博文不属于完全原创,但也是自己辛辛苦苦总结的,转载请注明出处,感谢! https://blog.csdn.net/m0_37454852/article/details/86606731
原题链接:1059 Prime Factors (25 分)
AC代码:
using namespace std;
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include <ctime>
#include <cmath>
typedef struct factor
{
int x, cnt;//x为质数因子,cnt为因子重数
}factor;
factor F[10] = {0};//不可能超过十个
const int MAX_SIZE = 100010;
long int P[MAX_SIZE] = {0};//若该位非质数则置1
int Prime[MAX_SIZE] = {0};//质数表
int FindPrime(int N)//求N以内质数表;并返回质数个数
{
int cnt = 0;
for(int i=2, j; i<=N; i++)
{
if(!P[i])
{
Prime[cnt++] = i;
for(j=2*i; j<=N; j+=i)
{
P[j] = 1;
}
}
}
return cnt;
}
int main()
{
int N, top = 0;
scanf("%d", &N);
int cnt = FindPrime((int)sqrt(1.0*N));//质数表
printf("%d=", N);
if(N == 1) printf("1");//1不是质数……但有个测试用例是这个,略坑
for(int i = 0; i<cnt; i++)
{
if(N%Prime[i] == 0)//该数是质数因子,继续判断该数是其多少重因子
{
F[top].x = Prime[i];
do
{
F[top].cnt++;
N /= Prime[i];
}while(N%Prime[i] == 0);
top++;
}
}
if(N != 1) F[top].x = N, F[top++].cnt++;//若N此时不为1,则必为其原本的一个质数因子
for(int i=0; i<top; i++)
{
if(i) printf("*");//打印注意控制格式
if(F[i].cnt == 1) printf("%d", F[i].x);
else printf("%d^%d", F[i].x, F[i].cnt);
}
return 0;
}