Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1k1×p2k2×⋯×pmkm.
Input Specification:
Each input file contains one test case which gives a positive integer N in the range of long int.
Output Specification:
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.
Sample Input:
97532468
Sample Output:
97532468=2^2*11*17*101*1291
题意:分解质因数,给出一个数,分解之。
思路:先打出质数表,然后再用N来除以这个质数表每个数,直到N变为1为止。
分两种情况:
1.质因子全部小于sqrt(n)
2.存在一个大于sqrt(n)的质因子,其余全部小于sqrt(n)
当n=1需要特判
#include<bits/stdc++.h>
using namespace std;
long long int n;
struct fac{
int x;
int cnt;
}factor[10000];
int num,num2;
int table[100010];
bool isprime(int x){
if(x<=1){
return false;
}else{
for(int i=2;i*i<=x;i++){
if(x%i==0){
return false;
}
}
}
return true;
}
void findtable(){
for(int i=0;i<100010;i++){
if(isprime(i)){
table[num++]=i;
}
}
}
int main(){
cin>>n;
int n2=n;
if(n==1){
printf("1=1");
return 0;
}
findtable();
int sqr=(int)sqrt(1.0*n);
for(int i=0;i<num&&table[i]<sqr;i++){
if(n%table[i]==0){
factor[num2].x=table[i];
while(n%table[i]==0){
factor[num2].cnt++;
n/=table[i];
}
num2++;
}
}
if(n!=1){
factor[num2].x=n;
factor[num2++].cnt=1;
}
printf("%d=",n2);
for(int i=0;i<num2;i++){
if(i>0){
printf("*");
}
printf("%d",factor[i].x);
if(factor[i].cnt>1){
printf("^%d",factor[i].cnt);
}
}
}