大神给看下,结果为什么错误50%,拜谢!(有详细注释)
题目网址:http://题目:
题目描述
定义:
f(1)=1, f(2)=1, f(n>2)=f(n-1)+f(n-2)
我们把符合以上定义的序列称为斐波那契序列,现在给你一个数字n,请你求出f(n)。
输入
输入包含多组测试数据。每组数据为一个正整数n。
输出
输出对应的f(n)。题目保证结果不会超过1000位数字。
样例输入
100
样例输出
354224848179261915075
我的代码:
程序代码:
#include <stdio.h> #include <string.h> char f[10000][1001]; int add(const char *a, const char *b, char *result,int N)//求字符串a,b的和病存放在result数组中,N是result所存字符最大个数 { char *p1 = strchr(a, 0)-1;//p1指向大数a的个位的字符 char *p2 = strchr(b, 0)-1;//p2指向大数b的个位的字符 //result[N] = '\0';//将result数组中最后一个存储单元标志词字符串的结束 int left, right, c, carry = 0; int j=0,i,t,len; while (p1 >= a || p2 >= b) { left = (p1 >= a) ? *p1 : '0';//left从低位到高位逐个拷贝大数a各个位上的值,超出最高位则left取‘0’ right = (p2 >= b) ? *p2 : '0';//right从低位到高位逐个拷贝大数b各个位上的值,超出最高位则right取‘0’ c = (left-'0') + (right-'0') + carry;//c将对应的位相加,并加上进位位carry carry = c/10;//进位 //将结果存在result中(结果正好是与正确结果逆序的) result[j++]=c % 10 + '0';//存对应位的和的个位 result[j]=carry +'0';//将进来的数存在下一空间内 --p1; --p2;//a和b个位加完加十位,十位加完加百位,以此类推 } //执行到现在j的值是result数组中存入值得个数,此时result的最后一个元素有可能是0,因为进位可能是0 result[j+1]='\0'; len=strlen(result); for(i=0;i<len/2;i++){//将result中的元素逆序排列 t=result[i]; result[i]=result[len-i-1]; result[len-i-1]=t; } //result就是计算结果,此时result的最高位可能是0 return j+1; } int main(){ int n,i,last=2,max=0; f[0][0]=f[1][0]='1'; //大体思路:计算斐波那契前n个元素的值,当计算完前100元素的值后存入二维数组f中,输入小于100的数n1,不会重复计算n1之前的元素 while(scanf("%d",&n)!=EOF){ if(n<3){ printf("%s\n",f[n-1]); continue; } if(max<n) max=n; for(i=last;i<max;i++){ add(f[i-1],f[i-2],f[i],1000); if(f[i][0]=='0')//处理最高位可能是0的情况 strcpy(f[i],&f[i][1]); } last=max; printf("%s\n",&f[n-1][0]); } return 0; }
测试文件:/test.out 结果:答案错误
=======原因======
当参考答案输出:
79665220964720909188841109484886582592430623
-------时---------
你的程序输出:
24204667906615555443036133086749222611890814
=================
测试文件:/sample.out 结果:答案正确