某种序列
时间限制:
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
-
输入包含多行数据
大数问题,首先A99 = m*A0 + n*A1 + k*A2 然后我就先写了一个大数加把m,n,k求出来,然后再套公式就行了。
注意题目会有0 0 0的输入,所以要特别判断一下 虽然我这样写可能麻烦些,但是最后的代码时间用的比较少。。。。。
先是计算出m,n,k:
#include <stdio.h>
struct node
{
int a[100], b[100], c[100];
};
node x[110];
void add(int n, int m)
{
int i;
if(n == 1)
{
x[m].a[0] = x[m - 1].a[0] + x[m - 2].a[0] + x[m - 3].a[0];
for(i = 1; i < 100; i++)
{
x[m].a[i] = x[m - 1].a[i] + x[m - 2].a[i] + x[m - 3].a[i] + x[m].a[i - 1] / 10;
x[m].a[i - 1] %= 10;
}
}
if(n == 2)
{
x[m].b[0] = x[m - 1].b[0] + x[m - 2].b[0] + x[m - 3].b[0];
for(i = 1; i < 100; i++)
{
x[m].b[i] = x[m - 1].b[i] + x[m - 2].b[i] + x[m - 3].b[i] + x[m].b[i - 1] / 10;
x[m].b[i - 1] %= 10;
}
}
if(n == 3)
{
x[m].c[0] = x[m - 1].c[0] + x[m - 2].c[0] + x[m - 3].c[0];
for(i = 1; i < 100; i++)
{
x[m].c[i] = x[m - 1].c[i] + x[m - 2].c[i] + x[m - 3].c[i] + x[m].c[i - 1] / 10;
x[m].c[i - 1] %= 10;
}
}
}
void print(int n[])
{
int i;
for(i = 99; i >= 0; i --)
{
if(n[i] != 0)
break;
}
for(; i >= 0; i--)
printf("%d", n[i]);
printf("\n");
/*
for(i = 0; i < 27; i++)
printf("%d, ", n[i]);
printf("\n");
*/
}
int main (void)
{
int i;
x[3].a[0] = x[3].b[0] = x[3].c[0] = 1;
x[4].a[0] = x[4].b[0] = 2;
x[4].c[0] = 1;
x[5].a[0] = 4;
x[5].b[0] = 3;
x[5].c[0] = 2;
for(i = 6; i <= 99; i++)
{
add(1, i);
add(2, i);
add(3, i);
}
print(x[99].a);
print(x[99].b);
print(x[99].c);
return 0;
}
套用公式:
#include <stdio.h>
#include <string.h>
int a[101] = {7, 1, 4, 4, 3, 9, 2, 1, 6, 7, 1, 7, 6, 1, 4, 8, 0, 7, 7, 8, 0, 2, 9, 9, 8, 2};
int b[101] = {1, 4, 2, 8, 8, 7, 1, 5, 4, 1, 3, 4, 1, 8, 6, 9, 1, 2, 5, 7, 6, 2, 3, 3, 4, 2};
int c[101] = {9, 8, 4, 3, 4, 8, 8, 5, 8, 7, 6, 1, 1, 7, 0, 2, 4, 5, 9, 7, 6, 2, 6, 7, 5, 1};
int x[101];
int y[101];
int z[101];
void change(int *n, int m)
{
int i = 0;
while(m)
{
n[i++] = m % 10;
m /= 10;
}
}
void mul(int *n, int *m)
{
int temp[200];
memset(temp, 0, sizeof(temp));
int i, j;
for(i = 0; i < 100; i++)
{
for(j = 0; j < 100; j++)
{
temp[i + j] += n[i] * m[j];
}
}
for(i = 1; i < 100; i++)
{
temp[i] += temp[i - 1] / 10;
temp[i - 1] %= 10;
n[i - 1] = temp[i - 1];
}
}
void add(int *n, int *m)
{
n[0] += m[0];
int i;
for(i = 1; i < 100; i++)
{
n[i] = n[i] + m[i] + n[i - 1] / 10;
n[i - 1] %= 10;
}
}
void print(int n[])
{
int i;
for(i = 99; i >= 0; i --)
{
if(n[i] != 0)
break;
}
for(; i >= 0; i--)
printf("%d", n[i]);
printf("\n");
}
int main (void)
{
int xx, yy, zz;
while(scanf("%d %d %d", &xx, &yy, &zz) != EOF)
{
if(xx == 0 && yy == 0 && zz == 0)
{
printf("0\n");
continue;
}
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
memset(z, 0, sizeof(z));
change(x, xx);//print1(x);
change(y, yy);//print1(y);
change(z, zz);//print1(z);
mul(x, c);//print(x);
mul(y, b);//print(y);
mul(z, a);//print(z);
add(x, y);//print(x);
add(x, z);
print(x);
}
return 0;
}