码迷,mamicode.com
首页 > 其他好文 > 详细

大整数加法

时间:2018-03-28 21:59:07      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:设置   判断   bubuko   个数   接收   src   多次   gets   定义   

//思路是把两个大整数当作字符串来输入,再通过数组进行字符到整型的转换,为了方便计算,在字符整型转换的过程中,可将数倒换位置,让最小的(也就是个位数)在前面,方便进位
#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;
}

技术分享图片

大整数加法

标签:设置   判断   bubuko   个数   接收   src   多次   gets   定义   

原文地址:https://www.cnblogs.com/flyingbrid-nest/p/8666204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!