这一题我在王道算法笔记上借鉴了一种素数筛法,可以提高效率,特别要注意输入1时直接输出“1=1”。
还有一点就是预先将一定范围内的素数都查找出来存放在数组中的思想。
#include<iostream>
using namespace std;
bool mark[100001];
int prime[100001];
int primeSize;
void init(){
primeSize=0;
for(int i=2;i<=100000;i++){
if(mark[i]==true) continue;
prime[primeSize++]=i;
if(i>=1000) continue;//1000*1000>100000
for(int j=i*i;j<100000;j+=i)
mark[j]=true;
}
}
int main(){
init();
int n,n1;
while(scanf("%d",&n)!=EOF){
if(n==1){cout<<"1=1";break;}
n1=n;
int ansPrime[30];
int ansSize=0;
int ansNum[30];
for(int i=0;i<primeSize;i++){
if(n%prime[i]==0){
ansPrime[ansSize]=prime[i];
ansNum[ansSize]=0;
while(n%prime[i]==0){
ansNum[ansSize]++;
n/=prime[i];
}
ansSize++;
if(n==1) break;
}
}
if(n!=1){
ansPrime[ansSize]=n;
ansNum[ansSize++]=1;
}
printf("%d=",n1);
for(int i = 0; i < ansSize; i++){
if(i > 0) printf("*");
printf("%d",ansPrime[i]);
if(ansNum[i] > 1) printf("^%d",ansNum[i]);
}
}
system("pause");
return 0;
}
其实本题也可以直接用朴素的素数判断法,也不会超时:https://www.cnblogs.com/wanghao-boke/p/9532827.html