| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 628 人关注过本帖
标题:大神给看下,结果为什么错误50%,拜谢!(有详细注释)
只看楼主 加入收藏
赤云
Rank: 2
等 级:论坛游民
帖 子:82
专家分:35
注 册:2014-12-29
结帖率:64.71%
收藏
已结贴  问题点数:8 回复次数:6 
大神给看下,结果为什么错误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   结果:答案正确
搜索更多相关主题的帖子: 正整数 
2015-08-28 09:00
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:1 
是不是在数据过大时出现错误

一片落叶掉进了回忆的流年。
2015-08-28 11:23
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:1 
可以用数组存出数据

一片落叶掉进了回忆的流年。
2015-08-28 11:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:5 
当参考答案输出:
79665220964720909188841109484886582592430623
-------时---------
你的程序输出:
24204667906615555443036133086749222611890814
你的算法效率低,我自己重新写了个,结果中没有“79665220964720909188841109484886582592430623”
只有f(829)“79665220964720909188841109484886582592430623522645192366050746631849723640209334307624289094857156812898603255442597755380462037559048637735379973817456585807376755928779529”

另外,f(4786)是最后一个不超过1000位的数,“7334343300431526745413249208471480941295886039383885689591799012660621316779395823705306935954440374490983316440510938218661503030861630551548176293222468430475826259959800604212901428982055681829150950655199287783857015061224226795482474623367665222282256870316117093830732812895097667473105049114270817452107418279883991688450006170770502566063032564075310632474734425490689190635259549767940099905087501320929296630972279603414930997444279094039374065272740853520039785786698227588316593293922583225068083713333591230083257890903615803904675715141475535706043142298866792045298371160569065663936383352746627653451155462689725430610815806257367133656040401322717863284076339742756245203855814663113490689862210696900867531084265725317796456979714878328669946807443728887797839435463413795912940497316758611168447311213734925988635812151655063724137755355835867847379508102339675238232695173896823234061425238260852508144856714319522307480482321929193614716737343149471726333522305539123082795222023”

2015-08-28 13:06
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:1 
从结果上来看,你的程序应该没问题
2015-08-28 13:13
赤云
Rank: 2
等 级:论坛游民
帖 子:82
专家分:35
注 册:2014-12-29
收藏
得分:0 
回复 2楼 诸葛欧阳
应该不会出现这种情况吧
2015-08-28 14:40
赤云
Rank: 2
等 级:论坛游民
帖 子:82
专家分:35
注 册:2014-12-29
收藏
得分:0 
回复 4楼 rjsp
这两个结果我检测都正确,是不是输出格式有问题?
结果没问题单为什么会出现错误50%的情况呢?太让人费解了。请问大神有没有办法让他通过?


[ 本帖最后由 赤云 于 2015-8-28 14:48 编辑 ]
2015-08-28 14:43
快速回复:大神给看下,结果为什么错误50%,拜谢!(有详细注释)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031257 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved