小记:之所以对这个水题写篇博文,主要是为了让自己谨记在写大数相加的代码时,要注意一点,用整数数组实现N进制的大整数相加算法在输出的时候记得用%0xd (x = lgN)。铭记这点就OK了。
题解:我是用数组进行预处理的,bignum[x][0] 表示第x个斐波那契数相对于N进制有多少位。然后从bignum[x][bignum[x][0]] 一直输出到bignum[x][1]。
代码奉上:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; #define max(x,y) ((x)>(y))?(x):(y) #define N 7500 int bignum[N][670]; void add(int x){ int i,t; t = max(bignum[x - 1][0],bignum[x - 2][0]); t = max(t,bignum[x - 3][0]); t = max(t,bignum[x - 4][0]); for(i = 1; i <= t; i ++){ bignum[x][i] += bignum[x - 1][i] + bignum[x - 2][i] + bignum[x - 3][i] + bignum[x - 4][i]; bignum[x][i + 1] = bignum[x][i] / 10000; bignum[x][i] %= 10000; } if(bignum[x][i] > 0)bignum[x][0] = t + 1;//存储第X个斐波那契数它的万进制表示有多少位 else bignum[x][0] = t; } void calc(){ int i; for(i = 5; i < N; i ++){ add(i); } } int main() { //freopen("d:\\in.txt","r",stdin); //freopen("d:\\out.txt","w",stdout); int i,j,n; for(i = 1; i < 5; i++){ bignum[i][0] = 1; bignum[i][1] = 1; } calc(); while(~scanf("%d",&n)){ if(n < 5){printf("1\n");continue;} i = bignum[n][0]; printf("%d",bignum[n][i]); for(i -= 1; i > 0; i--){ printf("%04d",bignum[n][i]);//注意输出 } putchar('\n'); } return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。