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);}

原创粉丝点击