| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 750 人关注过本帖
标题:问题出在哪里了?
只看楼主 加入收藏
幽灵X
Rank: 5Rank: 5
等 级:职业侠客
帖 子:128
专家分:328
注 册:2013-1-28
结帖率:80%
收藏
 问题点数:0 回复次数:11 
问题出在哪里了?
今天看了一个巨大数相加的程序,然后自己编写了一下,可就是运行后显示不出要的结果,自己看了好几遍也没搞明白问题所在,请教各位帮忙看看问题出在哪里了。

#include <stdio.h>
#include <string.h>
main()
{
    char n1[100],n2[100];
    int a[100],b[100],c[100],i,j,k,s1,s2;
    printf("请输入第一个大数:");
    gets(n1);
    printf("请输入第二个大数:");
    gets(n2);
    s1=strlen(n1);
    s2=strlen(n2);
    if(s1>s2)
        k=s1;
    else
        k=s2;
    j=k;
    for(i=0;i<=s1;i++,k--)
        a[k]=n1[s1-1-i]-'0';
    for(k=j;i<=s2;i++,k--)
        b[k]=n2[s2-1-i]-'0';
    for(i=j;i>=0;i--)
    {
        c[i]=a[i]+b[i];
        if(c[i]>=10)
        {
            c[i]=c[i]-10;
            c[i-1]++;
        }
    }
    if(a[0]!=0)
    {    for(i=0;i<=j;i++)
            printf("%d",c[i]);
    }
    else
    {    for(i=1;i<=j;i++)
            printf("%d",c[i]);
    }
    printf("\n");
    return 0;
}
搜索更多相关主题的帖子: include 
2013-02-01 21:56
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
收藏
得分:0 
错误分析:22行;
for(i=j;i>=0;i--)
{
    c[i]=a[i]+b[i];
    if(c[i]>=10)
    {
        c[i]=c[i]-10;
        c[i-1]++;
    }
}
这个地方,你在c[i]>=10后,c[i]=c[i]-10倒是对了,但是你直接c[i-1]++;这个时候c[i-1]都还没赋值怎么自加?而且就算这是和有值,自加完后,i--后又到c[i]=a[i]+b[i]又会重新赋值给他。所以你需要一个换位的变量并且初始化hw为0,c[i]=a[i]+b[i]+hw,当>=10的时候,就给换位变量赋值为1,让他在下一次赋值中+1,还要加个else,如果不是大于10的就要让换位变量又变成0....我想错误应该在此吧。
==========================================================
以下是我自己写的,计算结果和我用计算器按出来比对后是一样的,没有差错,LZ可以参考参考,不过我刚学没多久,才一个月多,所以code不是很有条理化也没去考虑什么节约内存,和简化语句等方面,只是算出正确的结果而已,请见谅。。(我当中的n1[s1]=(int)p1[s1]-48就想当与LZ的a[k]=n1[s1-1-i]-'0',把字符型数组里的数据转到整形数组中)
==========================================================
#include <stdio.h>
#include <string.h>
int main(void)
{
    char p1[100],p2[100];
    int i,j,hw=0,s1,s2,t1,t2,n1[100],n2[100],c[100];
    printf("请输入第一个大数:");
    gets(p1);
    printf("请输入第二个大数:");
    gets(p2);
    t1=strlen(p1);
    t2=strlen(p2);
    for(s1=0;s1<=(t1-1);s1++)
        n1[s1]=(int)p1[s1]-48;
    for(s2=0;s2<=(t2-1);s2++)
        n2[s2]=(int)p2[s2]-48;
    s1--;s2--;
    if(s1>s2)
    {
        for(j=i=s1+1;s2>=0;s1--,i--,s2--)
        {
            if((c[i]=n1[s1]+n2[s2]+hw)>=10)
            {
                c[i]=c[i]-10;
                hw=1;
            }
            else
            {
                hw=0;
            }
            c[0]=hw;
        }
        for(;i>0;i--,s1--)
            c[i]=n1[s1];
    }
    else
    {
        for(j=i=s2+1;s1>=0;s1--,i--,s2--)
        {
            if((c[i]=n1[s1]+n2[s2]+hw)>=10)
            {
                c[i]=c[i]-10;
                hw=1;
            }
            else
            {
                hw=0;
            }
            c[0]=hw;
        }
        for(;i>0;i--,s2--)
            c[i]=n1[s2];
    }
    if(hw==0)
        i=1;
    else
        i=0;
    for(;i<=j;i++)
    printf("%d",c[i]);
    printf("\n");
    return 0;
}


[ 本帖最后由 果沫 于 2013-2-2 10:14 编辑 ]
2013-02-01 23:42
firmthinking
Rank: 3Rank: 3
来 自:西南交通大学
等 级:论坛游侠
帖 子:43
专家分:115
注 册:2012-12-9
收藏
得分:0 
你的这个整体思路没有错但是小问题很多。
第一个问题在这两个for循环
for(i=0;i<=s1;i++,k--) a[k]=n1[s1-1-i]-'0'; for(k=j;i<=s2;i++,k--) b[k]=n2[s2-1'0';

-'0'没有意义。而且第二个for中i的初值没有归0。
第二个问题在两两相加。
先看
c[i]=a[i]+b[i];

再看
for(i=0;i<=s1;i++,k--) a[k]=n1[s1-1-i]-'0'; for(k=j;i<=s2;i++,k--) b[k]=n2[s2-1-i]-'0';

a或b数组中数字少的那一个数组在i大于s1或s2的时候已经停止对其中一个数组赋值。所以相加时有一段无法运算。
第三个问题在 [ quote] c[i]=c[i]-10; c[i-1]++; [/quote]
如果c[0]>9了怎么办?

手机码字好辛苦,没有机试,不然上代码。楼主仔细看看ḃ吧。
2013-02-02 00:28
firmthinking
Rank: 3Rank: 3
来 自:西南交通大学
等 级:论坛游侠
帖 子:43
专家分:115
注 册:2012-12-9
收藏
得分:0 
回复 2楼 果沫
是真的吗?你上机试过没?不会强制转化吗?
如果是真的不行,建议楼主把数组全改成整型。
2013-02-02 00:33
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
收藏
得分:0 
回复 4楼 firmthinking
强制转换会变  比如'0'强制转换成整形就不是0了,如果把它当做0去算下面的,果断出错,而是48,因为转换了类型,asiic码变了
2013-02-02 00:36
firmthinking
Rank: 3Rank: 3
来 自:西南交通大学
等 级:论坛游侠
帖 子:43
专家分:115
注 册:2012-12-9
收藏
得分:0 
回复 5楼 果沫
是啊!貌似字符和数字都有自己的asiic码。我无知了。
2013-02-02 00:50
幽灵X
Rank: 5Rank: 5
等 级:职业侠客
帖 子:128
专家分:328
注 册:2013-1-28
收藏
得分:0 
谢谢各位的解答,我会再好好看下的,有什么问题再与各位讨论研究。
2013-02-02 10:30
幽灵X
Rank: 5Rank: 5
等 级:职业侠客
帖 子:128
专家分:328
注 册:2013-1-28
收藏
得分:0 
我还找到了31行的错误:if(c[0]!=0)才对。
2013-02-02 12:04
幽灵X
Rank: 5Rank: 5
等 级:职业侠客
帖 子:128
专家分:328
注 册:2013-1-28
收藏
得分:0 
回复 2楼 果沫
你写的程序我测试了一下,好像有点问题。我修改了程序,你看看吧。
/*程序功能:求两个巨大数之和*/


#include <stdio.h>
#include <string.h>
main()
{
    char n1[200],n2[200];
    int a[200]={0},b[200]={0},i,j,k,s1,s2;
    printf("请输入第一个大数:");
    gets(n1);
    printf("请输入第二个大数:");
    gets(n2);
    s1=strlen(n1);
    s2=strlen(n2);
    if(s1>s2)
        k=s1;
    else
        k=s2;
    j=k;
    for(i=0;i<s1;i++,k--)
        a[k]=n1[s1-1-i]-'0';
    for(k=j,i=0;i<s2;i++,k--)
        b[k]=n2[s2-1-i]-'0';
    printf("\n");
    for(i=j;i>=0;i--)
    {
        a[i]=a[i]+b[i];
        if(a[i]>=10)
        {
            a[i]=a[i]-10;
            a[i-1]++;
        }
    }

    if(a[0]!=0)
    {    for(i=0;i<=j;i++)
            printf("%d",a[i]);
    }
    else
    {    for(i=1;i<=j;i++)
            printf("%d",a[i]);
    }
    printf("\n");
    return 0;
}
2013-02-02 12:16
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
收藏
得分:0 
回复 9楼 幽灵X
没吧。我测试过了啊,没发现问题啊,还用电脑上自带的计算器验算了一遍算对的啊
2013-02-02 12:24
快速回复:问题出在哪里了?
数据加载中...
 
   



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

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