P1601
题目描述
高精度加法,相当于a+b problem,不用考虑负数.
输入格式
分两行输入。a,b \leq 10^{500}a,b≤10500
输出格式
输出只有一行,代表a+ba+b的值
输入输出样例
输入 #1复制
1 1
输出 #1复制
2
输入 #2复制
1001 9099
输出 #2复制
10100
#include<iostream>
using namespace std;
string x, y;
int a[100000], b[100000], c[100000], la, lb, lc;
//1.字符串读入
//2.字符串转数组
//3.竖式加法
//4.消前导0
//5.倒序输出
int main()
{
cin >> x >> y;
la = x.length();
lb = y.length();
for (int i = 0; i < la; i++)
{
a[la - i] = x[i] - '0';
}
for (int i = 0; i < lb; i++)
{
b[lb - i] = y[i] - '0';
}
lc = max(la, lb);
for (int i = 1; i <= lc; i++)
{
c[i] += a[i] + b[i];
c[i + 1] = c[i] / 10;
c[i] %= 10;
}
if (c[lc+1] > 0) lc++;
for (int j = lc; j >=1; j--)
{
cout << c[j];
}
}
P2142
题目描述
高精度减法。
输入格式
两个整数 a,ba,b(第二个可能比第一个大)。
输出格式
结果(是负数要输出负号)。
输入输出样例
输入 #1复制
2 1
输出 #1复制
1
说明/提示
- 20\%20% 数据 a,ba,b 在 long long 范围内;
- 100\%100% 数据 0<a,b\le 10^{10086}0<a,b≤1010086。
//高精度减法
#include<iostream>
using namespace std;
string x, y;
int a[100000], b[100000], c[100000], la, lb, lc;
int main()
{
cin >> x >> y;
la = x.length();
lb = y.length();
if (la < lb || (la == lb && x < y))
{
swap(x, y);
swap(la, lb);
cout << "-";
}
for (int i = 0; i < la; i++)
{
a[la - i] = x[i] - '0';
}
for (int i = 0; i < lb; i++)
{
b[lb - i] = y[i] - '0';
}
for (int i = 1; i <= la; i++)
{
if (a[i] < b[i])
{
a[i] += 10;
a[i + 1]--;
}
c[i] = a[i] - b[i];
}
while(c[la] == 0&&la>1) la--;
for (int j = la; j >= 1; j--)
{
cout << c[j];
}
}
P1303
题目描述
求两数的积。
输入格式
两行,两个整数。
输出格式
一行一个整数表示乘积。
输入输出样例
输入 #1复制
1 2
输出 #1复制
2
说明/提示
每个数字不超过 10^{2000}102000 ,需用高精。
//高精度乘法
#include<iostream>
using namespace std;
string x, y;
int a[100000], b[100000], c[100000], la, lb, lc;
int main()
{
cin >> x >> y;
la = x.length();
lb = y.length();
for (int i = 0; i < la; i++)
{
a[la - i] = x[i] - '0';
}
for (int i = 0; i < lb; i++)
{
b[lb - i] = y[i] - '0';
}
for (int i = 1; i <= la; i++)
{
for(int j=1;j<=lb;j++)
{
c[i + j - 1] += a[i] * b[j];
c[i + j] += c[i + j - 1] / 10;
c[i + j - 1] %= 10;
}
}
lc = la + lb;
while (c[lc] == 0 && lc > 1) lc--;
for (int j = lc; j >= 1; j--)
{
cout << c[j];
}
}