SCAU 8629 热身游戏(高精度)
8629 热身游戏
时间限制:500MS 内存限制:1000K 提交次数:2 通过次数:1
题型: 编程题 语言: 无限制
Description
ACM 程序设计竞赛是一项激励人心的竞赛,除了考验大家的编程功底,更多的是考验大家的思维以 及数学运算能力。开赛前15分钟,我们华农的某队开始了以下对话: ipc:“我们玩接龙热一下身吧!免得一会没睡醒。” Arokenda:“好啊!没问题!怎么玩?” ipc:“我先写两个数,然后你我轮流接着已经写好的数列继续写数,每人写1 个数。接龙的规则就是, 下一个数是前两个数的和。” Arokenda:“这还不简单!不就是Fibonacci数列嘛。绝对秒杀啦!” 此时,ipc 开始写数:1、3。居然不是Fibonacci 数列!下一个就是4 啦!接着数列成型了:1、3、 4、7、11、18……一直写了N 项,ipc 觉得热身还不够。于是他忽然说了句:“求前N 项和怎么样?”两 个人顿时“卡”了一下…… 若ipc写出数列的前两项以及项数,你能算出来吗?
Input
输入一个整数T(T<=20),表示ipc写了T个数列。 接下来T行, 每行三个整数, 分别为a1,a2,n , 分别表示该数列的前两项和项数。其中0<a1,a2,n<=1000
Output
每组数据输出一行,该数列的前n项和sum(n)。
Sample Input
3 1 2 15 1 1 10 2 2 10
Sample Output
2582 143 286
Hint
Source
朱伟琛
Provider
admin
#include<stdio.h> #include<string.h> int main() { int T, n1[1000], n2[1000], n[1000], m[1000],temp, e, m1len, m2len, i, j, sum; char m1[1000], m2[1000]; scanf("%d", &T); while(T--) { memset(m1, 0, sizeof(m1)); memset(m2, 0, sizeof(m2)); memset(m, 0, sizeof(m)); memset(n1, 0, sizeof(n1)); memset(n2, 0, sizeof(n2)); memset(n, 0, sizeof(n)); scanf("%s%s%d", m1, m2, &sum); if(sum == 1) {printf("%s\n", m1); continue;} m1len = strlen(m1); m2len = strlen(m2); for(i=m1len-1; i>=0; --i) n[i] = n1[i] = m1[m1len-1-i]-'0'; for(i=m2len-1; i>=0; --i) n2[i] = m2[m2len-1-i]-'0'; for(i=2,e=0; i<=sum; ++i) { for(j=0; j<1000; ++j) { m[j] = n2[j]; temp = (n[j] + n2[j] + e); n[j] = temp%10; e = temp/10; } for(j=0,e=0; j<1000; ++j) { temp = (n1[j] + n2[j] + e); n2[j] = temp%10; e = temp/10; } for(j=0; j<1000; ++j) n1[j] = m[j]; } for(j=999; !n[j] && j>0; --j); for(; j>=0; --j) printf("%d", n[j]); printf("\n"); } return 0; }
解题报告:
#高精度#
建立在Fabionacci上,进行大数相加的运算。
输入[ 1 1 100]用unsigned long long 已经不能满足,更何况是[1000 1000 1000],经过多次的联系后,改变了以往的小心翼翼计算字符串长度而频繁用strlen函数,这
次索性开大数组,很快就过了,不然要在整型数组和字符数组之间转换,会浪费较多的时间(只因为strlen)
更多内容请关注个人微信公众号 物役记 (微信号:materialchains)
作者:雪影蓝枫
本文版权归作者和博客园共有,欢迎转载,未经作者同意须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。