Test Message

a740: 質因數之和

內容

求一個數全部質因數之和

比如,

6 = 2 x 3,則輸出 2 + 3 = 5

8 = 2 x 2 x 2,則輸出 2 + 2 + 2 = 6


輸入

每行一個正整數,x<2000000000, 以 EOF 為結束

19
32

輸出

對應的因數和

19
10


解題思路

判斷質數裡的方法判斷質數,如果輸入是質數,直接輸出輸入值當答案,如果不是則從質數表第 0 項試除輸入值到最後一項或輸入值等於 1 為止 (但由於輸入值不是質數所以一定會在質數表結束前變成 1,故不用做值數表結束的判斷)


完整程式碼

AC (2ms, 196KB)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 47000

int primeList[5000], pLen;

int cmp(const int* lhs, const int* rhs)
{
return *lhs - *rhs;
}

void SetPrimeList()
{
char isNot[MAX] = { 0 };
primeList[pLen++] = 2;
for (int i = 3; i < MAX; i += 2)
{
if (isNot[i])continue;
primeList[pLen++] = i;
for (int j = i << 1; j < MAX; j += i)
isNot[j] = 1;
}
}

char isPrime(int n)
{
if (n < MAX)
{
int* item = (int*)bsearch(&n, primeList, pLen, sizeof(int), cmp);
return (item != NULL);
}
else
{
for (int i = 0, max = sqrt(n); primeList[i] <= max; i++)
{
if (!(n % primeList[i]))
return 0;
}
return 1;
}
}

int main()
{
SetPrimeList();
int n, ans;
while (scanf(" %d", &n) == 1)
{
if (isPrime(n))
printf("%d\n", n);
else
{
ans = 0;
for (int i = 0; n > 1; i++)
{
while (!(n % primeList[i]))
{
n /= primeList[i];
ans += primeList[i];
}
}
printf("%d\n", ans);
}
}
return 0;
}