大神给看下,结果为什么错误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 结果:答案正确









