| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6668 人关注过本帖
标题:高精度加法
只看楼主 加入收藏
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
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
就算是小数,一样做

小代码,大智慧
2011-01-21 09:41
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 10:10
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
今天又继续研究高精度减法

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 10:11
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
我写过一个高精度求余的程序(也包含一部分减法),但是很不满意。你帮忙也研究一下,共同进步。

[ 本帖最后由 godbless 于 2011-1-21 10:21 编辑 ]
2011-01-21 10:18
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
我以前写大数除法(字符串)操作,可以实现浮点

小代码,大智慧
2011-01-21 10:20
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
仿照高精度加法写了一个高精度减法,但是又出了不少问题
#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[1000];
    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')
    while(b[i]!='\0')
    {
    sum[i]=a[i];
    i++;
    }
    else
    while(a[i]!='\0')
    {
        sum[i]=a[i];
        i++;
    }
    sum[i]='\0';
    for(i=0;sum[i]!='\0';i++)
    if(b[i]>a[i])
    {
    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-21 12:01
点线面
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--;
        }

}

void Sub(char a[],char b[],char *sum,int length_a)            //减法核心
{
    int i;
    for(i=length_a-1;i>=0;i--)
     {
        sum[i] = a[i]-b[i]+sum[i];
        if( sum[i] <0)
        {
            sum[i] += +10;
            if(i>0)
            sum[i-1]--;
        }
     }
}

void prinf(char sum[],int length_a,char flag)   //输出部分
{
    int length_b;

        if(flag)
            putchar('-');

        for(length_b =0 ;sum[length_b]==0&&(length_b+1<length_a);length_b++); //处理前面零

        for(;length_b <length_a;length_b++)  //输出
        {
         printf("%d",sum[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;
    }

    if(strcmp(a,b)>=0)   //比加法增加了字符串
    {

        Sub(a,b,sum,length_a);
        prinf(sum,length_a,0);
    }
    else
    {
        Sub(b,a,sum,length_a);
        prinf(sum,length_a,1);
    }
    system("pause");
    return 0;

}


[ 本帖最后由 点线面 于 2011-1-21 12:08 编辑 ]

小代码,大智慧
2011-01-21 12:04
vbc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:352
专家分:147
注 册:2006-12-30
收藏
得分:0 
回帖切磋是一种美德

清远鹏程万里人才网:[url=http://www.]http://www.[/url]zq.,qy.
2011-01-21 12:39
快速回复:高精度加法
数据加载中...
 
   



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

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