| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6668 人关注过本帖
标题:高精度加法
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 5楼 马后炮
按照你说的改了一下

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-20 16:43
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:45 
写了个对齐相加的。
#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[10],b[10],sum[10];
    int length_a,length_b,i;
    gets(a),gets(b);//获取字符串
    rollback(a,strlen(a)),rollback(b,strlen(b));
    for(i=0;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);
    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;
}


[ 本帖最后由 godbless 于 2011-1-20 16:52 编辑 ]
2011-01-20 16:50
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
谢谢,roll back是什么函数,作用是什么,能加些注释好吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-20 16:53
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
反转字符串,为了倒着加,这样不用补0
2011-01-20 16:54
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:50 
程序代码:
#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=0,j=0;

    gets(a);
    gets(b);//获取字符串

    length_a=strlen(a),
        length_b=strlen(b);//获取字符串长度

        i = length_a-1;
        j = length_b-1;
    if(length_a>length_b)
    {

        while(i>=0)
        {
            if(j>=0)
            b[i]=b[j];
            else
            b[i]='0';
            i--;
            j--;
        }
        b[length_a]=0;
        j=length_a;
    }
    else
    {
        while(j>=0)
        {
            if(i>=0)
            a[j]=a[i];
            else
            a[j]='0';
            i--;
            j--;
        }
        a[length_b]=0;
        j=length_b;
    }

   
    for(i=j-1;i>=0;i--)
    {
        sum[i+1] = a[i]+b[i]+sum[i+1]-2*'0';
        if( sum[i+1] >= 10)
        {
            sum[i+1] += -10;
            sum[i]++;
        }
    }
   
    for(i=0;i<=j;i++)
        {if(sum[i]==0&&i==0)
            continue;
    printf("%d",sum[i]);}
    system("pause");
    return 0;

}



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

小代码,大智慧
2011-01-20 16:59
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
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
本来想改小小东西,谁知道全部都改了

小代码,大智慧
2011-01-20 17:04
freedgun
Rank: 5Rank: 5
等 级:职业侠客
帖 子:147
专家分:302
注 册:2010-11-11
收藏
得分:0 
好多代码。

有什么样的付出,就有什么样的收获!!
2011-01-20 17:20
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void rollback(char *ScL,int length_a,int length_b)   //对于长度短的字符串前面填充零
{
    ScL[length_a+1]='\0';
    while(length_a>=0)
        {
            if(length_b>=0)
            ScL[length_a]=ScL[length_b];
            else
            ScL[length_a]='0';
            length_a--;
            length_b--;
        }

}
int main()
{
    char a[10]={0},b[10]={0},sum[10]={0};
    int length_a,length_b;

    gets(a);
    gets(b);//获取字符串

    length_a = strlen(a),
    length_b = strlen(b);//获取字符串长度

    if(length_a  >length_b)
    {
        rollback(b,length_a-1,length_b-1);
    }
    else
    {   
        rollback(a,length_b-1,length_a-1);
        length_a = length_b;
    }

   
    for(length_b = length_a-1;length_b >=0 ; length_b--)
    {
        sum[length_b+1] = a[length_b]+b[length_b] + sum[length_b+1]-2*'0';
        if( sum[length_b+1] >= 10)  //注意字符范围,不然物极必反
        {
            sum[length_b+1] += -10;
            sum[length_b]++;
        }
    }
   
    for(length_b = 0;length_b <= length_a;length_b++)  //输出
        {
            if(sum[length_b]==0 && length_b==0)   //处理前面零
            continue;
         printf("%d",sum[length_b]);
        }
    system("pause");
    return 0;

}

LZ看懂吗

小代码,大智慧
2011-01-20 17:45
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
楼上的意思我明白了,比如说我输入的是12345和123456两个数。
那么,a[0]=1,a[1]=2...a[4]=5而b[0]=1,b[1]=2...b[5]=6,如果直接相加就会出现
246906这样的结果,但是如果a数组前面补0就不一样了,数组a变成a[0]=0,a[1]=1,
....a[5]=5,这样一一对应相加才不会出错。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-01-20 23:18
快速回复:高精度加法
数据加载中...
 
   



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

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