此題要將 30980 之內的質數找出來就夠用了,如果數大於 30980,再用這些質數的次方看找不找的到。以下是找質數 makeprime() 以及 isprime(long long int n) 判斷質數的函式,C 語言程式碼如下:
int makeprime(){
int i, j;
for(i = 3; i <= MAXSIZE; i += 2)
if(!prime[i]){
for(j = i + i; j <= MAXSIZE; j += i)
prime[j]=1;
prime_table[prime_table_len ++]=i;
}
}
int isprime(long long int n){
int i,temp;
if(n == 2) return 0;
if(n % 2 == 0) return 2;
if(n <= MAXSIZE){
if ((1-prime[n]))
return 0;
}
for(i = 0;i != prime_table_len && prime_table[i] * prime_table[i] <= n; ++ i)
if(n % prime_table[i] == 0)
return prime_table[i];
return 0;
}
再來用一遞迴函式將傳入的值印出因數,C 語言程式碼如下:
void printFactors(long long int n)
{
long long int i;
if (n != 1 && n != 0)
i = isprime(n);
else return;
if(i)
printf("%s%lld\n", " ", i), printFactors(n/i);
if (!i && n != 1) printf("%s%lld\n", " ",n);
return;
}
最後,主程式只須這樣呼叫:
makeprime();
long long int n, i;
while (1)
{
scanf("%lld", &n);
if (n < 0) break;
printFactors(n);
printf("\n");
}
By David.K
p10392題目連結
回ACM題庫目錄
回首頁
沒有留言:
張貼留言