大整数加法

Posted flyingbrid-nest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大整数加法相关的知识,希望对你有一定的参考价值。

//思路是把两个大整数当作字符串来输入,再通过数组进行字符到整型的转换,为了方便计算,在字符整型转换的过程中,可将数倒换位置,让最小的(也就是个位数)在前面,方便进位
#include<stdio.h>
#include<string.h>        //需要用到strlen来获得字符串长度
#define N 200               //定义N来设置数组长度
int main()
{
    int i,k=0;                   //i用来循环,k用来记录相加后的有效数组长度
    char ch1[N],ch2[N],tran_num[N];         //ch1,ch2用来接收输入数据,tran_num用来储存最终数据
    int num1[N],num2[N],temp_num[N]={0};        //num1,num2是用来转换的两个整型数组,temp_num用来放相加完后的数,为了计算,先用零清空
    gets(ch1);
    gets(ch2);
    for(i=0;i<strlen(ch1);i++)        //字符转换为整型,并掉换位置
    {
        num1[i]=ch1[strlen(ch1)-1-i]-‘0‘;    
        num2[i]=ch2[strlen(ch2)-1-i]-‘0‘;
    }
    for(i=0;i<strlen(ch1);i++)        //两数相加
    {
        if((temp_num[i]+num1[i]+num2[i])>=10)    //判断i位置三个数相加是否大于等于10,如果是,则进1,其i位减10(要注意因为前面可能有进1,所以要判断三个数而不能只判断两个)
        {
            temp_num[i]+=num1[i]+num2[i]-10;
            temp_num[i+1]+=1;
        }
        else
        {
            temp_num[i]+=num1[i]+num2[i];
        }
        k++;
        if(i==(strlen(ch1)-1)&&(num1[strlen(ch1)-1]+num2[strlen(ch2)-1]>=10))        //判断进行最后一次相加时是否进位了,如果进位,k加多一次
        {
            k++;
        }
        }
    for(i=0;i<k;i++)        //转换回字符数组
    {
        tran_num[i]=temp_num[k-i-1]+‘0‘;
    }
    puts(tran_num);
    return 0;
}

Wrong Answer好多次,一点点改,一点点改,这个版本目前只能用来计算相同长度的两个整数,后续改进ing......

技术分享图片
技术分享图片

//1.0版本,支持两个不等长的整数相加,更新的一个判断和一个计算时候的条件,其他基本一样 
#include<stdio.h>
#include<string.h>
#define N 200
int main()
{
    int i,k=0;
    char ch1[N],ch2[N],tran_num[N],temp[N];         //新出现的temp用来做交换字符数组的中间数组
    int num1[N],num2[N],temp_num[N]={0};
    gets(ch1);
    gets(ch2);
        if(strlen(ch2)>strlen(ch1))    //把长的数放在ch1中
    {
        strcpy(temp,ch1);
        strcpy(ch1,ch2);
        strcpy(ch2,temp);
    }
    for(i=0;i<strlen(ch1);i++)
    {
        num1[i]=ch1[strlen(ch1)-1-i]-‘0‘;
        num2[i]=ch2[strlen(ch2)-1-i]-‘0‘;
    }
    if(strlen(ch1)>strlen(ch2))        //多了这个判断,如果是不等长数组,进行新的算法,等长照旧
    {
        for(i=0;i<strlen(ch1);i++)
        {
            if(i>(strlen(ch2)-1))    //判断ch2是否已经相加完,如果相加完,后面只需要把ch1中多出的数放入temp_num的相应位置
            {
                temp_num[i]+=num1[i];
                k++;
            }
            else
            {
                    if((temp_num[i]+num1[i]+num2[i])>=10)
                {
                    temp_num[i]+=num1[i]+num2[i]-10;
                    temp_num[i+1]+=1;
                }
                else
                {
                    temp_num[i]+=num1[i]+num2[i];
                }
                k++;
            }
        }
    }
    else
    {
            for(i=0;i<strlen(ch1);i++)
        {
            if((temp_num[i]+num1[i]+num2[i])>=10)
            {
                temp_num[i]+=num1[i]+num2[i]-10;
                temp_num[i+1]+=1;
            }
            else
            {
                temp_num[i]+=num1[i]+num2[i];
            }
            k++;
            if(i==(strlen(ch1)-1)&&(num1[strlen(ch1)-1]+num2[strlen(ch2)-1]>=10))
            {
                k++;
            }
        }
    }
    for(i=0;i<k;i++)
    {
        tran_num[i]=temp_num[k-i-1]+‘0‘;
    }
    puts(tran_num);
    return 0;
}

技术分享图片


以上是关于大整数加法的主要内容,如果未能解决你的问题,请参考以下文章

大整数加法 HDU1002

HDU - 1002 A + B Problem II (大整数加法)

大整数加法和大整数乘法

1151: 大整数加法(正数)

PHP 大数字加法 大整数加法

大整数加法