UVa10220 - I Love Big Numbers !
来源:互联网 发布:数据库时间怎么修改 编辑:程序博客网 时间:2024/06/01 20:34
#include <stdio.h>#include <string.h>#define MAX 3000void 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);}