给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472
减法还有点凌乱,慢慢整理,
符号判断放在外面了,函数比较好写
卡在string的 > <符号重载是按字典序来的
会判断出1000 > 999的情况
所以不能直接比较数值大小 需要先判断位数
位数相同再用 > < 比较
#include <iostream>
using namespace std;
string sum(string a,string b)
{
if(b.length() > a.length())
{
string tmp = a;
a = b;
b = tmp;
}
for(int i = a.length()-1,j = b.length()-1;i >= 0;i --,j --)
{
a[i] = char(a[i] + (j >= 0 ? b[j] - '0' : 0));
if(a[i] - '0' >= 10)
{
a[i] = char( (a[i] - '0') % 10 + '0' );
if(i)
a[i-1] ++;
else
a = '1' + a;
}
}
return a;
}
string jian(string a,string b)
{
string c;
if(b.length() > a.length())
{
string tmp = a;
a = b;
b = tmp;
}
else if(b.length() == a.length() && b > a)
{
string tmp = a;
a = b;
b = tmp;
}
for(int i = a.length()-1,j = b.length()-1;i >= 0;i --,j --)
{
if(j >= 0)
{
if(a[i] - b[j] < 0)
{
c = char( ((a[i] + 10) - b[j]) + '0') + c;
int tmp = i - 1;
while(a[tmp] == '0')
{
a[tmp] = '9';
tmp --;
}
a[tmp] --;
}
else
{
c = char(a[i] - b[j] + '0') + c;
}
}
else
c = a[i] + c;
}
while(c[0] == '0' && c.length() > 1)
c.erase(c.begin(),c.begin()+1);
return c;
}
int main()
{
string a,b;
while(cin>>a>>b)
{
if(a[0] != '-' && b[0] != '-')
a = sum(a,b);
else if(a[0] == '-' && b[0] != '-')
{
a.erase(a.begin(),a.begin() + 1);
if(a.length() > b.length() || a.length() == b.length() && a > b)
{
a = "-" + jian(a,b);
}
else
a = jian(a,b);
}
else if(a[0] !='-' && b[0] == '-')
{
b.erase(b.begin(),b.begin()+1);
if(b.length() > a.length() || b.length() == a.length() && b > a)
{
a = "-" + jian(a,b);
}
else
{
a = jian(a,b);
}
}
else
{
a.erase(a.begin(),a.begin() + 1);
b.erase(b.begin(),b.begin() + 1);
if (a == "0" && b == "0")
a = "0";
else
a = "-" + sum(a,b);
}
cout<<a<<endl;
}
return 0;
}
大数乘法
直接全乘了 最后进位
#include <iostream>
using namespace std;
typedef long long ll;
const ll MAXN = 1200;
string a,b;
int aa[MAXN] = {0}, bb[MAXN] = {0}, ans[2 * MAXN] = {0};
string string_multi(string a, string b)
{
if(b.length() > a.length())
{
string tmp = a;
a = b;
b = tmp;
}
int lena = a.length(), lenb = b.length();
for(int i = lena - 1, flag = 0; i >= 0 ; i--, flag++)
{
aa[flag] = a[i] - '0';
}
for(int i = lenb - 1, flag = 0; i >= 0 ; i--, flag++)
{
bb[flag] = b[i] - '0';
}
for(int i = 0; i < lenb ; i++ )
{
for(int j = 0 ; j < lena; j++)
{
ans[i + j] += aa[j] * bb[i];
}
}
int flag = 2 * MAXN ;
for(int i = 0 ; i < flag; i++) //进位
{
ans[i + 1] += ans[i] / 10;
ans[i] = ans[i] % 10;
}
flag = 2 * MAXN ;
for(flag; ans[flag] == 0;flag --);
string sans;
for(;flag >= 0;flag --)
sans = sans + char(ans[flag] + '0');
return sans;
}
int main()
{
string a, b, ans;
cin>>a>>b;
ans = string_multi(a, b);
cout<<ans<<endl;
return 0;
}
贴个多进制的高精度加法
#include <iostream>
using namespace std;
const int MAXN = 1e4 + 10;
int arr[MAXN] = {0}, brr[MAXN] = {0}, ans[MAXN] = {0};
int main()
{
string mode = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int N;
cin>>N;
string a, b;
cin>>a>>b;
for(int i = a.length() - 1, j = 0; i >= 0; i--, j++)
{
if(a[i] >= '0' && a[i] <= '9')
{
arr[j] = a[i] - '0';
}
else
{
arr[j] = a[i] - 'A' + 10;
}
}
for(int i = b.length() - 1, j = 0; i >= 0; i--, j++)
{
if(b[i] >= '0' && b[i] <= '9')
{
brr[j] = b[i] - '0';
}
else
{
brr[j] = b[i] - 'A' + 10;
}
}
for(int i = 0; i < MAXN - 10; i++)
{
ans[i] += (arr[i] + brr[i]);
if(ans[i] >= N)
{
ans[i + 1] += (ans[i] / N);
ans[i] %= N;
}
}
int tf = MAXN - 9;
for( ; ans[tf] == 0 && tf >= 1; tf--);
for( ; tf >= 0; tf--)
{
cout<<mode[ans[tf]];
}
cout<<endl;
return 0;
}
高精度