高精度加法

本文介绍了一种改进的无逆序大数相加算法,通过合理分配存储空间并优化加法过程,提高了算法效率。该算法避免了传统方法中先逆序存储再正序计算的步骤,直接在原有数据上进行操作,减少了额外的内存使用和计算复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//看到网上有一种方法是逆序存储在计算输出的,所以想了一种不要逆序的
//感觉自己写的有很多地方可以优化。。。
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值