1. 程式人生 > >openjudge2.2分解因數

openjudge2.2分解因數

1751:分解因數

總時間限制: 1000ms 記憶體限制: 65536kB
描述
給出一個正整數a,要求分解成若干個正整數的乘積,即a = a1 a2 a3 ... an,並且1 < a1 <= a2 <= a3 <= ... <= an,問這樣的分解的種數有多少。注意到a = a也是一種分解.
輸入
第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括一個正整數a (1 < a < 32768)
輸出
n行,每行輸出對應一個輸入。輸出應是一個正整數,指明滿足要求的分解的種數
樣例輸入
2
2
20
樣例輸出
1
4

wrong answer:

include

include

using namespace std;
int a[102];
int mod(int x)
{
int t = 1, i;
for(i = 2; i <= floor(sqrt(x)); i++)
if(x % i == 0)
t += mod(x / i);
return t;
}
int main()
{
int n;
scanf("%d", &n);
for(int j = 0; j < n; j++)
{
scanf("%d", &a[j]);
printf("%d\n", mod(a[j]));
}
return 0;
}

錯誤答案當輸入30時,2 3 5和 3 2 5和5 3 2重複,只能得5分

accepted

include

include

using namespace std;
int a[102];
int mod(int x, int y)
{
int t = 1, i;
for(i = x; i <= floor(sqrt(y)); i++)
if(y % i == 0)
t += mod(i, y / i);
return t;
}
int main()
{
int n;
scanf("%d", &n);
for(int j = 0; j < n; j++)
{
scanf("%d", &a[j]);
printf("%d\n", mod(2, a[j]));
}
return 0;
}

正確答案在函式中使用了兩個引數,每次從x開始迴圈,而不是從2開始,避免了重複的情況