10:大整数加法
总时间限制:
1000ms
内存限制:
65536kB
描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222 33333333333333333333
样例输出
55555555555555555555
来源
程序设计实习2007
代码:
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string>
using namespace std;
//函数定义
int *bingintadd(string s1, string s2)
{
if (s1.length() < s2.length())
{
string t = s2;
s2 = s1;
s1 = t;
}
int len1 = s1.length();
int len2 = s2.length();
//创建数组
int *arr1 = new int[200];
int *arr2 = new int[200];
int *ans = new int[200];
for (int i = 1; i <= 200; i++)
{
arr1 [i - 1] = 0;
arr2 [i - 1] = 0;
ans [i - 1] = 0;
}
//数组赋值
for (int i = 1; i <= len1; i++)//倒着赋值避免前导0
{
arr1 [i - 1] = s1[len1 - i] - '0';
}
for (int i = 1; i <= len2; i++)
{
arr2 [i - 1] = s2[len2 - i] - '0';
}
//对arr1和arr2相加
int jinwei = 0;
for (int i = 1; i <= len1 + 1; i++)//预留1位可能超出len1
{
ans[i - 1] = (arr1[i - 1] + arr2[i - 1] + jinwei) % 10;
if (arr1[i - 1] + arr2[i - 1] + jinwei >= 10)
{
jinwei = 1;
}
else
{
jinwei = 0;
}
}
return ans ;
}
int main()
{
string str1, str2;
cin >> str1 >> str2;
if (str1.length() < str2.length())
{
string t = str2;
str2 = str1;
str1 = t;
}
int len1 = str1.length();
int len2 = str2.length();
int *ans0 = bingintadd(str1, str2);
int flag ; //判断是否有前道0的标志
if (ans0[len1 + 1 - 1] == 0)
{
flag = 0;
}
else flag = 1;
for (int i = len1 + 1; i >= 1; i--)
{
if (i >= 2 && ans0[i - 1] == 0 && flag == 0)
{
if (ans0[i - 2] != 0)
{
flag = 1; //消除结束
}
continue;
}
cout << ans0[i - 1];
}
delete[]ans0;
return 0;
}


652

被折叠的 条评论
为什么被折叠?



