某种序列
时间限制: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;
}