nyo 114 某种序列

来源:互联网 发布:知乎经济思想史 编辑:程序博客网 时间:2024/05/22 05:13

某种序列

时间限制:3000 ms  内存限制:65535 KB
难度:4
描述
数列A满足An = An-1 + An-2 + An-3, n >= 3 
编写程序,给定A0, A1 和 A2, 计算A99
输入
输入包含多行数据 
每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <=100000000) 
数据以EOF结束
输出
对于输入的每一行输出A99的值
样例输入
1 1 1
样例输出
69087442470169316923566147

万进制适用于阶乘、累乘这种问题。加法根本不会在某一位置上超出19, 没必要用万进制啊。。。。
然后这题其实没啥特别的,加的地方和大数加法一样,就是迭代的问题,迭代不用非得递归或者一次次调用某个函数,可以在每次加完就更新a.b.c的当前值。比如:开始a= b = c = 1,然后加过一次,d = 3. 这时候更新a为1, b为1,c为3,然后继续加。。。。此时d为5,然后再更新,a为1, b为3, c为5,这时d为9,继续……



#include
#include
int main()
{
    char a1[100], b1[100],c1[100];
    int a[100], b[100],c[100], d[100], i, j, la, lb, lc, jin, s;
    while(~scanf("%s %s %s",a1, b1, c1))
    {
       if(!strcmp(a1, "0") && !strcmp(b1, "0")&& !strcmp(c1, "0"))
       {
          printf("0\n");
          continue;
       }
       la = strlen(a1);
       lb = strlen(b1);
       lc = strlen(c1);
       memset(a, 0, sizeof(a));
       memset(b, 0, sizeof(b));
       memset(c, 0, sizeof(c));
       memset(d, 0, sizeof(d));
       for(i = la-1, j = 0 ; i >= 0 ; i--,j++)
           a[j] =a1[i] - 48;
       for(i = lb-1, j = 0 ; i >= 0 ; i--,j++)
           b[j] =b1[i] - 48;
       for(i = lc-1, j = 0 ; i >= 0 ; i--,j++)
           c[j] =c1[i] - 48;
       for(j = 3 ; j <= 99 ; j++)
       {
           jin =0;
           for(i = 0; i <= 99 ; i++)
           {
              s = a[i] + b[i] + c[i] +jin;
              d[i] = s % 10;
              jin = s / 10;
           }
           for(i = 0; i <= 99 ; i++)
           {
              a[i] = b[i];
              b[i] = c[i];
              c[i] = d[i];
           }
       }
       for(i = 99 ; i >= 0 ; i--)
       {
          if(d[i])
          break;

       }
       for(; i >= 0 ; i--)
          printf("%d", d[i]);
       printf("\n");
    }
    return 0;
}

0 0