PAT_A1059
PAT甲级1059.
目录
A1059
题目
样例
输入:
97532468
输出:
97532468=2^2*11*17*101*1291
思路和坑点
首先需要获得素数表,使用筛选法获取素数表,考虑题目给的数值范围,素数表的大小10000即可。然后对每一个素数用除法进行因式分解,直到无法整除为止,由此获得因子的个数。每获得一个因子的信息,遍输出一次。为了控制*号,使用标记进行控制,出了第一个不输出*号以外,其他都需要输出。
坑点
要注意第三个测试点的特判 1=1
AC代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10000
bool Prime[MAXN];
void getprime(){ // 筛选法获得素数表
fill(Prime,Prime+MAXN,true);
Prime[0]=Prime[1]=false;
for(int i=2;i<MAXN;i++){
if(Prime[i]){
for(int j=i+i;j<MAXN;j+=i)
Prime[j]=false;
}
}
}
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
getprime();
int n,tag=0; //tag为控制*号的标记
cin>>n;
if(n==1) {printf("1=1"); return 0;} //特判1的情况 (坑点所在,第三个测试点)
printf("%d=",n); //打印算式的头部
for(int i=2;;i++){ //因数从2开始
int cnt=0; //用于因数的计数
if(Prime[i]){ //如果该因数是素数
while(n%i==0){ //每次除以因数(直到不能整除),进行分解计数
n/=i; cnt++;
}
}
if(cnt){ //如果有因数
if(tag) putchar('*'); //如果是第一次打印,不需要*
tag=1; //修改标记
if(cnt==1) printf("%d",i); //如果因数个数为1,不打印个数
else printf("%d^%d",i,cnt);
}
if(n==1) break; //当n分解完成时结束循环
}
return 0;
}