| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6668 人关注过本帖
标题:高精度加法
取消只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏
已结贴  问题点数:100 回复次数:17 
高精度加法
我写了一个高精度加法的程序,但是结果错误,不知道为什么?
程序代码:
#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
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
能提供一下代码吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-20 14:54
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
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 5楼 马后炮
按照你说的改了一下

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-20 16:43
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
谢谢,roll back是什么函数,作用是什么,能加些注释好吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-20 16:53
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 14楼 godbless
还有一些不懂
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void rollback(char array[],int Len)//反转
{
char temp;
int i;
for(i=0;i<Len/2;i++)
temp=array[i],array[i]=array[Len-i-1],array[Len-i-1]=temp;
}
int main()
{
    char a[1000],b[1000],sum[10000];
    int length_a,length_b,i;//a串的长度,b串的长度
    gets(a),gets(b);//获取字符串
    length_a=strlen(a),length_b=strlen(b);//获取a串的长度,b串的长度
    rollback(a,length_a),rollback(b,length_b);//反转字符串
    while(a[i]!='\0'&&b[i]!='\0')//先相加字符串
    {
    sum[i]=a[i]+b[i]-48;
    i++;
    }
    //以下一段不懂
    if(a[i]=='\0')
    for(;b[i]!='\0';sum[i]=b[i],++i);
    else for(;a[i]!='\0';sum[i]=a[i],++i);
    //end
    //
    sum[i]='\0';
    for(i=0;sum[i]!='\0';++i)
    if(sum[i]>'9')
    {
    sum[i]-=10;
    if(sum[i+1]=='\0') sum[i+1]='1',sum[i+2]='\0';
    else sum[i+1]++;
    }
    //
    rollback(sum,strlen(sum));//反转回来
    puts(sum);//打印字符串
    system("pause");
    return 0;
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-20 17:04
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
我已经完全理解了代码:
程序代码:
可能代码格式不好,明天有空将这个程序分函数写。中间还有个优化,可以去掉。
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void rollback(char array[],int Len)//反转
{
char temp;
int i;
for(i=0;i<Len/2;i++)
temp=array[i],array[i]=array[Len-i-1],array[Len-i-1]=temp;
}
int main()
{
    char a[1000],b[1000],sum[10000];
    int length_a,length_b,i;//a串的长度,b串的长度
    gets(a),gets(b);//获取字符串
    length_a=strlen(a),length_b=strlen(b);//获取a串的长度,b串的长度
    rollback(a,length_a),rollback(b,length_b);//反转字符串
while(a[i]!='\0'&&b[i]!='\0')//先相加字符串
{
sum[i]=a[i]+b[i]-48;
i++;
}
    if(a[i]=='\0')//i这时是最后一个字符,如果等于0
while(b[i]!='\0')//如果b也不等于0,那么没有进位直接填入sum
{
sum[i]=a[i];
i++;
}
else
while(a[i]!='\0')//同上,反之
{
sum[i]=a[i];
i++;
}
    sum[i]='\0';//将最高位填入0,以免溢出
    for(i=0;sum[i]!='\0';i++)//循环strlen(sum)次
if(sum[i]>'9') //满10进一
{
sum[i]-=10;//将sum减去10
if(sum[i+1]=='\0') sum[i+1]='1',sum[i+2]='\0';//如果遇到高位0,那么将最高位填入1,将溢出位往前移动
else sum[i+1]++;//否则就直接进位
}
    rollback(sum,strlen(sum));//反转回来
    puts(sum);//打印字符串
    system("pause");
    return 0;
}
==================================================================================================
优化部分为:
while(a[i]!='\0'&&b[i]!='\0')//先相加字符串
{
sum[i]=a[i]+b[i]-48;
i++;
}
    if(a[i]=='\0')//i这时是最后一个字符,如果等于0
while(b[i]!='\0')//如果b也不等于0,那么没有进位直接填入sum
{
sum[i]=a[i];
i++;
}
else
while(a[i]!='\0')//同上,反之
{
sum[i]=a[i];
i++;
}
==================================================================================================
优化思路为:
如果遇到:
1000000000000+1,那么可以将1直接填入计算,免去后面进位步骤

 

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 09:37
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 19楼 点线面
有了前面的铺垫,自然是懂了

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 09:38
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 

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



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

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