A Japanese young girl went to a Science Fair at Tokyo. There she met with a Robot named Mico-12, which had AI (You must know about AI-Artificial Intelligence). The Japanese girl thought, she can do some fun with that Robot. She asked her, “Do you have any idea about maths?”. “Yes! I love mathematics”, The Robot replied.
“Okey! Then I am giving you a number, you have to find out the Factorial of that number. Then find the sum of the digits of your result!. Suppose the number is 5. You first calculate 5! = 120, then find sum of the digits 1 + 2 + 0 = 3. Can you do it?”.
“Yes. I can do!” Robot replied.
“Suppose the number is 100, what will be the result?”. At this point the Robot started thinking and calculating. After a few minutes the Robot head burned out and it cried out loudly “Time Limit Exceeds”.
The girl laughed at the Robot and said “The sum is definitely 648”.
“How can you tell that?” Robot asked the girl. “Because I am an ACM World Finalist and I can solve the Big Number problems easily”.
Saying this, the girl closed her laptop computer and went away.
Now, your task is to help the Robot with the similar problem.
Input
The input file will contain one or more test cases.
Each test case consists of one line containing an integers n (n ≤ 1000).
Output
For each test case, print one line containing the required number. This number will always fit into an integer, i.e. it will be less than 2^31 − 1.
Sample Input
5
60
100
Sample Output
3
288
648
问题链接:UVA10220 I Love Big Numbers !
问题简述:(略)
问题分析:
这是一个大数计算问题,对于输入的n,计算n!的各位之和。
大数问题的关键是数据表示。这里用二维数组来存储1!-n!的各个值。为了避免重复计算就先打表。然后把各位加起来就可以了。
程序说明:
数组digits[]中存放1!-n!的位数,digits[i]中存放i!的位数,便于后续的计算。
还需要说明的是程序中常量L=3000是怎么得来的。由于n的最大值为1000,那么可以用程序中的函数init()试算一下,1000!的长度是多少位,够用就可以了。
题记:(略)
参考链接:(略)
AC的C++语言程序如下:
/* UVA10220 I Love Big Numbers ! */
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
const int L = 3000;
int a[N + 1][L], digits[N + 1];
void init()
{
memset(a, 0, sizeof(a));
// 模拟阶乘计算
int len = 1;
a[1][0] = 1;
for(int i = 2; i <= N; i++) {
int carry = 0;
for(int j = 0; j < len; j++) {
int t = a[i-1][j] * i + carry;
carry = t / 10;
a[i][j] = t % 10;
}
while(carry) {
a[i][len++] = carry % 10;
carry /= 10;
}
digits[i] = len;
}
}
int main()
{
init();
int n;
while(~scanf("%d", &n)) {
int ans = 0;
for(int i = 0; i <= digits[n]; i++)
ans += a[n][i];
printf("%d\n", ans);
}
return 0;
}