Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1k1×p2 k2 ×⋯×pmkm .
Each input file contains one test case which gives a positive integer N in the range of long int.
Factor N in the format N =
p1 ^
k1 *
p2 ^
k2 *
…*
pm ^
km , where pi 's are prime factors of N in increasing order, and the exponent ki is the number of pi – hence when there is only one pi , ki is 1 and must NOT be printed out.
97532468
97532468=2^2*11*17*101*1291
这题就是找一个数的所有质因子,以样例来说,97532468有2个2,有1个11,有1个17,有1个101,有1个1291,然后输出的格式是次方之间相乘的形式(但是题目说了,1个时候不输出1次方,因此样例输出后面都没有次方符号了)。
处理这种问题很简单,先用筛法打表,然后在素数表里找N的因子,如果找到了,那么先记录当前的因子,然后不断除这个因子(这是为了看看这个因子有多少个,比如样例中因子2有2个,因此一定要反复除同一个因子)。然后,如果不能再整除当前这个因子的话,就前往找下一个素因子(这里N不用变回原来的N,除了就除了,没事的)。最后,如果N已经被除到只有1了,那么break掉即可~
【注意点】:因为素数是从2开始的,但是给出的N是在int型范围内的正整数(long int就是int),因此还有1的情况,这个时候特判输出就行了(输出1=1)。
【PS】PTA的网页编译器界面好像更新了hhh,终于不是前几天的纯黑色文本了,好看多了哈~
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 100010;
struct factor{
int num;
int cnt;
}result[maxn];
int prime[maxn], pNum = 0;
bool p[maxn] = {false};
void FindPrime(){
for(int i=2;i<maxn;i++){
if(p[i]==false){
prime[pNum++] = i;
for(int j=i+i;j<maxn;j+=i) p[j] = true;
}
}
}
int main(){
FindPrime();
int N;
scanf("%d", &N);
int nowN = N;//保存N的备份,因为下面会变
int index = 0;
for(int i=0;i<pNum;i++){
if(N==1) break;
if(N%prime[i]==0){
result[index].num = prime[i];
while(N%prime[i]==0){
result[index].cnt++;
N /= prime[i];
}
index++;
}
}
if(nowN==1) printf("1=1");//特判
else{
printf("%d=", nowN);
for(int i=0;i<index;i++){
if(i==0){
if(result[i].cnt==1) printf("%d", result[i].num);
else printf("%d^%d", result[i].num, result[i].cnt);
}
else{
if(result[i].cnt==1) printf("*%d", result[i].num);
else printf("*%d^%d", result[i].num, result[i].cnt);
}
}
}
return 0;
}