Problem 56: 某种序列(大数加法+数列)

来源:互联网 发布:单片机哪种好 编辑:程序博客网 时间:2024/04/17 06:31
/*************************************************************************Problem 56: 某种序列Time Limit:3 Ms| Memory Limit:128 MBDifficulty:2Description数列A满足An = An-1 + An-2 + An-3, n >= 3 编写程序,给定A0, A1 和 A2, 计算A99Input输入包含多行数据 每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <= 100000000) 数据以EOF结束Output对于输入的每一行输出A99的值Sample Input1 1 1Sample Output69087442470169316923566147Sourcewater problem ************************************************************************/  /*************************************************************************解题分析:* 类似fibonacci数列;0 <= A0, A1, A2 <= 100000000, 输出位数最多69087442470169316923566147;* 特殊情况:0 0 0* 要点:字符窜处理 ************************************************************************/#include <stdio.h>#include <string.h>#define M 150char a[M], b[M], c[M];int da[M], db[M], dc[M];int sum[M];void switch_str(char m[], int n[]) {    int i, len=strlen(m);    int j=0;    for(i=len-1; i>=0; i--) {        n[j++] = m[i] - '0';    }}void add(int m[], int n[], int l[]) {    int i;    for(i=0; i<M; i++) {        sum[i] = m[i] + n[i] +l[i];    }    int c = 0;    for(i=0; i<M; i++) {        sum[i] += c;        c = sum[i]/10;        sum[i] %= 10;    }}void swap(int all[], int u[], int v[], int w[]) {    int i;    for(i=0; i<M; i++) {        w[i] = v[i];        v[i] = u[i];        u[i] = all[i];    }}int main(void) {    int i, j;    while(~scanf("%s%s%s", a, b, c)) {if(!strcmp(a,"0") && !strcmp(b, "0") && !strcmp(c, "0")) {printf("0\n");continue;}        memset(da, 0, sizeof(da));        memset(db, 0, sizeof(db));        memset(dc, 0, sizeof(dc));        memset(sum, 0, sizeof(sum));        switch_str(a, da);        switch_str(b, db);        switch_str(c, dc);        for(j=3; j<100; j++) {            add(da, db, dc);            swap(sum, da, db, dc);        }        for(i=M; i>=0; i--) {            if(da[i] != 0) {                break;            }        }        while(i>=0) {            printf("%d", da[i--]);        }        puts("");    }    return 0;}