NYOJ 某种序列

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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值