题目:对于每组测试数据,在一行中给出一非负整数n(n小于等于100)
样例输入
3
5
10
样例输出
6
120
3628800
超时的代码如下:
#include <iostream>
#include <cstring>
using namespace std; int main(){
int n, count = 0;
int a[100] = {1};
cin >> n;
if(n == 0){
cout << 1;
return 0;
}
for(int i = n; i >= 1; i--){
for(int j = 0; j <= count; j++){
a[j] *= i;
}
for(int j = 0; j <= count; j++){
if(a[j] > 10){
while(a[j] >= 10){
a[j] -= 10;
a[j + 1]++;
}
}
}
while(a[count]){
count++;
}
}
for(int i = count - 1; i >= 0; i--)
cout << a[i];
return 0;
}
上面代码最多只能跑出18的阶乘。
下面的代码是可行的:
#include <iostream>
using namespace std; int main(){
int a[1000] = {1};
int len = 1;
int n, q = 0;
cin >> n;
if(n == 0){ //注意0的阶乘是1
cout << 1;
return 0;
}
for(int i = 1; i <= n; i++){
q = 0; //每次要置零
for(int j = 0; j < len; j++){
a[j] = a[j] * i + q;
q = a[j] / 10;
a[j] = a[j] % 10;
}
if(q > 0){
a[len] += q; //加上退出前进位
len++;
}
}
for(int i = len - 1; i >= 0; i--)
cout << a[i];
return 0;
}