高精度加法

//看到网上有一种方法是逆序存储在计算输出的,所以想了一种不要逆序的
//感觉自己写的有很多地方可以优化。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 20

void Plus(char *addend1,char *addend2,char *result)
{
    int short_arr[MAX]={0},long_arr[MAX]={0},plus[MAX]={0};
    int i,l,length1,length2,ends,endl;
//ends记录较短数据在short_arr数组中的尾部位置
//endl记录较长数据在long_arr数组中的尾部位置
    length1=strlen(addend1);
    length2=strlen(addend2);
    if(length1>=length2)
    {
        for(i=0;i<length1;i++)
        {
            long_arr[i]=addend1[i]-'0';
        }
        for(i=0;i<length2;i++)
        {
            short_arr[i]=addend2[i]-'0';
        }
        l=length1;
        ends=length2-1;
        endl=length1-1;
    }
    else
    {
        for(i=0;i<length1;i++)
        {
            short_arr[i]=addend1[i]-'0';
        }
        for(i=0;i<length2;i++)
        {
            long_arr[i]=addend2[i]-'0';
        }
        l=length2;
        ends=length1-1;
        endl=length2-1;
    }
//根据数据长度进行存储转化(char -->int)

    for(i=l;ends>=0;ends--,endl--,i--)
    {
        plus[i]+=short_arr[ends]+long_arr[endl];
        if(plus[i]>=10)
        {
            plus[i-1]++;
            plus[i]-=10;
        }
    }
    for(;endl>=0;endl--,i--)
    {
        plus[i]+=long_arr[endl];
        if(plus[i]>=10) //大于10进位
        {
            plus[i-1]++;
            plus[i]-=10;
        }
    }
//对应数组元素进行加法运算并将和存储在plus数组中
/*因为结果的长度要么等于最大的一个数据长度,要么比它大1,所以我将result数组的第一个
位置空出来用来存放最高位(0 or 1)。
*/
    if(plus[0]==0)
        result[0]=plus[0]+'0';
    if(plus[0]==1)
        result[0]=plus[0]+'0';
    if(plus[0]==0)
	{
        for(i=1;i<=l;i++)
            result[i-1]=plus[i]+'0';
		result[i-1]='\0';
	}
    if(plus[0]==1)
	{
        for(i=1;i<=l;i++)
            result[i]=plus[i]+'0';
		result[i]='\0';
	}
}
//将结果进行存储转化(int -->char)。别忘了最后在结尾加上'\0'
int main()
{
    char addend1[MAX],addend2[MAX],result[MAX];

    gets(addend1);
    gets(addend2);
    Plus(addend1,addend2,result);
    puts(result);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值