#include <stdio.h>
#include <string.h>
#define MAX 3000
void reverse(char *from, char *to);
void call_mult(char *first, char *second, char *result);
char map[MAX][MAX] = {"1", "1", "2", "6"};
int main()
{
char buf[10];
int n;
int i;
int sum, len;
setvbuf(stdout, NULL, _IONBF, 0);
for (i = 4; i <= 1000; i++) {
sprintf(buf, "%d", i);
call_mult(map[i - 1], buf, map[i]);
}
while (scanf("%d", &n) != EOF) {
len = strlen(map[n]);
for (i = 0, sum = 0; i < len; i++) {
sum += map[n][i] - '0';
}
printf("%d\n", sum);
}
return 0;
}
void reverse(char *from, char *to)
{
int i, len = strlen(from);
for (i = 0; i < len; i++)
to[i] = from[len - 1 - i];
to[len] = '\0';
}
void call_mult(char *first, char *second, char *result)
{
char F[MAX], S[MAX], Res[MAX];
int f_len, s_len, i, carry, r_len, r, f, s;
int sum;
f_len = strlen(first);
s_len = strlen(second);
r_len = f_len + s_len;
reverse(first, F);
reverse(second, S);
r = -1;
for (i = 0; i < r_len; i++)
Res[i] = '0';
Res[i] = '\0';
for (s = 0; s < s_len; s++) {
for (f = 0, carry = 0; f < f_len; f++) {
sum = (F[f] - '0') * (S[s] - '0') + (Res[f + s] - '0') + carry;
Res[f + s] = sum % 10 + '0';
carry = sum / 10;
if (f + s > r)
r = f + s;
}
while (carry) {
sum = (Res[f + s] - '0') + carry;
Res[f + s] = sum % 10 + '0';
carry = sum / 10;
if (f + s > r)
r = f + s;
}
}
for (; r > 0 && Res[r] == '0'; r--);
Res[r + 1] = '\0';
reverse(Res, result);
}
UVa10220 - I Love Big Numbers !
最新推荐文章于 2023-08-29 09:30:39 发布