/*************************************************************************
Problem 56: 某种序列
Time Limit:3 Ms| Memory Limit:128 MB
Difficulty:2
Description
数列A满足An = An-1 + An-2 + An-3, n >= 3
编写程序,给定A0, A1 和 A2, 计算A99
Input
输入包含多行数据
每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <= 100000000)
数据以EOF结束
Output
对于输入的每一行输出A99的值
Sample Input
1 1 1
Sample Output
69087442470169316923566147
Source
water problem
************************************************************************/
/*************************************************************************
解题分析:
* 类似fibonacci数列;0 <= A0, A1, A2 <= 100000000, 输出位数最多69087442470169316923566147;
* 特殊情况:0 0 0
* 要点:字符窜处理
************************************************************************/
#include <stdio.h>
#include <string.h>
#define M 150
char 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;
}
Problem 56: 某种序列(大数加法+数列)
最新推荐文章于 2019-12-07 10:57:15 发布