每日一题C++版(超长整数加法)
编程是很多偏计算机、人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用。因此小白决定开辟一个新的板块“每日一题”,通过每天一道编程题目来强化和锻炼自己的编程能力(最起码不会忘记编程)
特别说明:编程题来自“牛客网”和“领扣”以及热心小伙伴的题目。由于小白有时想锻炼某一类编程方法,所以提供的代码不一定是最优解,但是本文提供的编程代码均为通过测试代码。
超长整数加法
题目描述
请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法的输入则返回error
输入描述:
输入为一行,包含两个字符串,字符串的长度在[1,100]。
输出描述:
输出为一行。合法情况输出相加结果,非法情况输出error
示例
输入
123 123
abd 123
输出
246
Error
解析
本题关键的问题在于输入的字符串数字非常的长,用int和long类型都不可以将其完全表示出来。因此需要采用一些小技巧,首先判断输入的字符串中是否都为数字,之后对按位进行整数加法,同时需要记录是否有进位。
代码
#include <iostream>
#include <string>
using namespace std;
bool isNum(string str)
{
for(int i = 0; i < str.size(); i++)
if(str[i] <= '0' || str[i] >= '9')
return false;
return true;
}
void pinjie(string str1, string str2)
{
int i1 = str1.size() - 1;
int i2 = str2.size() - 1;
string str = "";
int c = 0;//进位位
while(1)
{
int n;
if(i1 >= 0 && i2 >= 0)
n = str1[i1] + str2[i2] - '0' - '0' + c;
else if(i1 >= 0 && i2 < 0)
n = str1[i1] - '0' + c;
else if(i2 >= 0 && i1 < 0)
n = str2[i2] - '0' + c;
else
break;
if(n > 10)
{
c = 1;
n %= 10;
}
else
c = 0;
str = (char)(n + '0') + str;
i1--;
i2--;
}
if(c)str = "1" + str;
cout << str << endl;
}
int main()
{
string str1,str2;
cin >> str1 >> str2;
if(isNum(str1) && isNum(str2))
pinjie(str1, str2);
else
cout << "error" << endl;
return 0;
}
运行结果