1. 程式人生 > >A1059 Prime Factors

A1059 Prime Factors

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; }