A1059 Prime Factors
阿新 • • 發佈:2018-12-02
1.這種題目寫起來還是有一點麻煩的,因為特殊資料很多
2.建議先用一個p陣列存素數,篩法會比較快,也就是下面程式碼的find函式
3.1=1要特別判斷,然後就是*的輸出情況,避免出現5=*5的情況
4.maxn要開的夠大
#include <stdio.h>
#include <math.h>
const int maxn = 100010;
int p[maxn],len = 0; //素數陣列
bool table[maxn] = {false};//false表示是素數
void Find() //篩法找素數
{
for(int i=2;i<maxn;i++ ){
if(table[i]==false){
p[len++] = i;
for(int j=i+i;j<maxn;j += i)table[j] = true;
}
}
}
bool isPrime(long long n)//判斷是否為素數,輸出的時候用
{
if(n<=1)return false;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)return false;
}
return true;
}
int main(int argc, char const *argv[])
{
long long n;
scanf("%lld",&n);
Find(); //這句不要忘了寫
//for(int i=0;i<len;i++)printf("%d ",p[i]);
printf("%lld=",n);
if(n==1)printf("1"); //1=1特別判斷
else{
int flag = 0; //用來控制*的輸出
for(int i=0;i<len;i++){ //遍歷素數陣列
int exp = 0; //指數計數
while(n%p[i]==0){
n /= p[i];
exp++;
}
if(exp){ //只要指數不為0
if (flag)printf("*");
printf("%d",p[i]);
flag = 1;
}
if(exp>=2)printf("^%d",exp);//指數大於1才輸出指數
if(isPrime(n)){
if(flag)printf("*");
printf("%d",n);
break;
}
}
}
return 0;
}