任意正整数相加

任意正整数相加

// BigNumberPlus.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
#define MAX_SIZE  100
void BigNumberPlus(char* num1, char* num2);


int main()
{
    char* number1 = new char[MAX_SIZE+1];
    char* number2 = new char[MAX_SIZE+1];
    gets_s(number1,MAX_SIZE+1);          //换行符结束字符串的输入
    gets_s(number2,MAX_SIZE+1);
    BigNumberPlus(number1,number2);
    delete[] number1;
    delete[] number2;
    return 0;
}


void BigNumberPlus(char* num1, char* num2)
{
    int num1_len, num2_len;
    num1_len = strlen(num1);
    num2_len = strlen(num2);
    char* sum = new char[MAX_SIZE+2];

    int max_len;
    max_len = num1_len > num2_len ? num1_len : num2_len; //max_len是两个字符串中的较长字符串的元素个数

    char* number1 = new char[max_len+1];            
    char* number2 = new char[max_len+1];


    /*memset(number1,'0',max_len+1);   //初始化的过程已经完成字符串的对齐
    number1[max_len] = '\0';
    memset(number2,'0',max_len+1);
    number2[max_len] = '\0';*/


    /*字符串反转
      下边两个for(){}实现字符串反转的功能,便于实现两个字符串的相加
    */
    int i, j;
    for (i = num1_len-1,j=0; i >= 0; i--,j++)
    {
        number1[j] = num1[i];
    }
    number1[j] = '\0';
    for (i = num2_len-1,j=0; i >= 0; i--,j++)
    {
        number2[j] = num2[i];
    }
    number2[j] = '\0';

    /*字符串对齐
      下边两个if(){}和number1[j] = '\0';  number2[j] = '\0';
      实现字符串对齐功能,与39行到42行实现的功能是一样的
      当采用39行到42的代码运行时,要注销掉两个if(){}和number1[j] = '\0';  number2[j] = '\0';
    */
    int count = 0;
    int pos = 0;
    if (num1_len>num2_len)
    {
        count = num1_len - num2_len;
        pos = num2_len;
        while (count--)
        {
            number2[pos++] = '0';
        }
        number2[pos] = '\0';
    }

    if (num2_len>num1_len)
    {
        count = num2_len - num1_len;
        pos = num1_len;
        while (count--)
        {
            number1[pos++] = '0';
        }
        number1[pos] = '\0';
    }


    int is_carrybit = 0;//is_carrybit用来保存低位上的进位

    bool is_overflow=false ;  //is_overflow用来标记最高位有没有向更高位的进位,即两数相加有没有溢出
    int sum_bit=0;  //用于保存字符串number1和字符串number2对应一位相加的和
    for (i=0;i<max_len;i++)
    {
        sum_bit = number1[i] - '0' + number2[i] - '0'+is_carrybit;
        if (sum_bit > 9)
        {
            if (i == max_len - 1)
            {
                is_overflow = true;
            }
            is_carrybit = 1;
            sum_bit -= 10;
        }
        else
        {
            is_carrybit = 0;
        }
        sum[i] = sum_bit + '0';
    }

    if (is_overflow)  //如果溢出,要改变sum[]的长度,将sum[max_len]赋值为is_carrybit, sum[]的长度加1 
        sum[max_len++] = is_carrybit + '0';

    sum[max_len] = '\0';

    for  (i = strlen(sum)-1; i >=0 ; i--)
    {
        cout << sum[i];
    }

    delete[] number1;
    delete[] number2;
    delete[] sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值