NYOJ 某种序列

来源:互联网 发布:如何理解大数据运用 编辑:程序博客网 时间:2024/06/18 00:22
某种序列
时间限制: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


此题因为数字较大,要用数组来模拟加法, 对于没写过高精度或比较少写高精度的希望自己写写,因为其中可能会出错,关键本题的代码可以写的很精简,但有些人可能会写的很繁琐。这一题其实就是在写大整数加法;输入时若num1==num2==num3==0,则输出0,继续循环;以下写的还算精简吧,不拖泥带水;


AC代码:


# include <stdio.h># include <string.h>int ans[100][100];void func(int *a, int *b, int *c, int *d){//模拟3个数加法,反向相加int carry=0;for(int i=0; i<=99; i++){d[i]=(a[i]+b[i]+c[i]+carry)%10;carry=(a[i]+b[i]+c[i]+carry)/10;}}int main(){ int n, num1, num2, num3;int i, j, k;while(scanf("%d%d%d", &num1, &num2, &num3)!=EOF){    if(num1==0&&num2==0&&num3==0){//都为零输出零,继续循环    printf("%d\n", 0);    continue;    }memset(ans, 0, sizeof(ans));//初始化为零i=0;while(num1||num2||num3){//将各个数提取出来ans[0][i]=num1%10;num1=num1/10;ans[1][i]=num2%10;num2=num2/10;ans[2][i]=num3%10;num3=num3/10;i++;}for(k=3; k<=99; k++){//逐步往后计算func(ans[k-3], ans[k-2], ans[k-1], ans[k]);}for(i=99; i>=0; i--){if(ans[99][i]){break;}}for(j=i; j>=0; j--){printf("%d", ans[99][j]);}printf("\n");}return 0;}


0 0
原创粉丝点击