| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6668 人关注过本帖
标题:高精度加法
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏
已结贴  问题点数:100 回复次数:45 
高精度加法
我写了一个高精度加法的程序,但是结果错误,不知道为什么?
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ZERO -99
int main()
{
    char a[10]={0},b[10]={0},sum[10]={0};
    int length_a,length_b,i,max;
    memset(sum,ZERO,sizeof(sum));
    gets(a),gets(b);//获取字符串
    length_a=strlen(a),length_b=strlen(b);//获取字符串长度
    if(length_a>length_b) max=length_a;//获取最长串
    else max=length_b;
    //转换为数字串
    for(i=0;i<length_a;i++)
    a[i]=a[i]-48;
    for(i=0;i<length_b;i++)
    b[i]=b[i]-48;
    //end
    for(i=max-1;i>=0;i--)
    {
    sum[i]=a[i]+b[i];//相加
    while(sum[i]>=10)//如果大于10,则进位
        sum[i]=sum[i]-10,sum[i-1]=sum[i-1]+1;
    }
    i=0;
    while(sum[i]!=ZERO)
    printf("%d",sum[i]),i++;
    system("pause");
    return 0;
}


搜索更多相关主题的帖子: color 
2011-01-20 13:49
刘定邦
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:687
专家分:1570
注 册:2010-9-21
收藏
得分:0 
不懂.学习一下.
2011-01-20 14:00
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
for(i=max-1;i>=0;i--)
    {
    sum[i]=a[i]+b[i];//相加
    while(sum[i]>=10)//如果大于10,则进位
        sum[i]=sum[i]-10,sum[i-1]=sum[i-1]+1;
    }
    i=0;
  sum[-1]=sum[-1]+1 //这里可能出问题,非法占用其它空间,产生难估计数据
   还有
长度要对齐,不足的地方前面补零,怎样没有看见你写,如果加上短长度数时,你前面没有补足零,会发产生难预测的数据


[ 本帖最后由 点线面 于 2011-1-20 14:06 编辑 ]

小代码,大智慧
2011-01-20 14:03
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
能提供一下代码吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-20 14:54
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:0 
不要使用while(sum[i]!=ZERO)来判断这个大整数的长度,这是不现实的

还有,
for(i=max-1;i>=0;i--)
    {
    sum[i]=a[i]+b[i];//相加
    while(sum[i]>=10)//如果大于10,则进位
        sum[i]=sum[i]-10,sum[i-1]=sum[i-1]+1;
    }

这里的max应该取较小的那个数的长度,剩下的另起一个循环处理可能的进位,因为超出较小数的长度后,那个相加是错的

樱之雪,晓之车
2011-01-20 15:34
limingzhen90
Rank: 2
等 级:论坛游民
帖 子:53
专家分:72
注 册:2010-12-31
收藏
得分:0 
楼上的,给点代码嘛,学习学习

入门了吗?
2011-01-20 16:07
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:5 
#include<stdio.h>
#include<string.h>
int main()
{
    char a[10000],b[10000];
    int c[10000],l,n,m,i,t,num=0,shang;
    scanf("%d",&t);
    while(t--)
    {
       num++;
       scanf("%s%*c%s",a,b);
       n=strlen(a)-1;m=strlen(b)-1;l=0;shang=0;
       while(n>=0&&m>=0)
       {
          c[l++]=(shang+(a[n]-48+b[m]-48))%10;
          shang=(shang+(a[n]-48+b[m]-48))/10;
          n--;m--;
       }
       while(n>=0)
       {
           c[l++]=(shang+a[n]-48)%10;
           shang=(shang+a[n]-48)/10;
           n--;
       }
       while(m>=0)
       {
          c[l++]=(shang+b[m]-48)%10;
          shang=(shang+b[m]-48)/10;
          m--;
       }
       printf("Case %d:\n",num);
       printf("%s + %s = ",a,b);
       i=l;
      if(shang!=0) printf("%d",shang);
       for(i=l-1;i>=0;i--)
           printf("%d",c[i]);
       printf("\n");
       if(t!=0) printf("\n");
    }
  return 0;
}
2011-01-20 16:08
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
https://gist.
2011-01-20 16:38
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 5楼 马后炮
为什么?你能说说为什么呢?

我的进位错在哪里呢。。。

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-20 16:41
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ZERO -99
int main()
{
    char a[10]={0},b[10]={0},sum[10]={0};
    int length_a,length_b,i,min;
    memset(sum,ZERO,sizeof(sum));
    gets(a),gets(b);//获取字符串
    length_a=strlen(a),length_b=strlen(b);//获取字符串长度
    if(length_a<length_b) min=length_a;//获取最长串
    else min=length_b;
    //转换为数字串
    for(i=0;i<length_a;i++)
    a[i]=a[i]-48;
    for(i=0;i<length_b;i++)
    b[i]=b[i]-48;
    //end
    for(i=min-1;i>=0;i--)
    {
    sum[i]=a[i]+b[i];//相加
    while(sum[i]>=10)//如果大于10,则进位
        sum[i]=sum[i]-10,sum[i-1]=sum[i-1]+1;
    }
    i=0;
    while(sum[i]!=ZERO)
    printf("%d",sum[i]),i++;
    system("pause");
    return 0;
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-20 16:43
快速回复:高精度加法
数据加载中...
 
   



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

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