高精度基本认识
登录以参加训练计划
A+B
#include <bits/stdc++.h>
using namespace std;
const int LEN = 200;
string A, B;
int aLen, bLen, cLen;
int a[LEN + 5], b[LEN + 5], c[LEN + 1 + 5];
int main()
{
// 以字符串形式输入
cin >> A >> B;
// 转换为数字并翻转存入数组
aLen = A.size();
bLen = B.size();
cLen = max(aLen, bLen); // 相加的结果,在进位之前的长度
for (int i = 0; i < aLen; i++)
a[aLen - i - 1] = A[i] - '0';
for (int i = 0; i < bLen; i++)
b[bLen - i - 1] = B[i] - '0';
// (可选)数组清零
for (int i = aLen; i < cLen; i++)
a[i] = 0;
for (int i = bLen; i < cLen; i++)
b[i] = 0;
for (int i = 0; i < cLen; i++)
c[i] = 0;
// 相加
for (int i = 0; i < cLen; i++)
c[i] = a[i] + b[i];
// 进位
for (int i = 0; i < cLen - 1; i++)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
// 最高位扩展
while (c[cLen - 1] >= 10)
{
c[cLen] = c[cLen - 1] / 10;
c[cLen - 1] %= 10;
cLen++;
}
// 前导 0 去除
while (cLen > 1 && c[cLen - 1] == 0)
cLen--;
// 输出
for (int i = cLen - 1; i >= 0; i--)
cout << c[i];
return 0;
}
A-B
#include <bits/stdc++.h>
using namespace std;
const int LEN = 200;
string A, B;
int cFlag;
int aLen, bLen, cLen;
int a[LEN + 5], b[LEN + 5], c[LEN + 5];
int main()
{
// 以字符串形式输入
cin >> A >> B;
// 调整减法顺序,只做大数减小数
// 此题 A,B 都没有多余的前导 0,可以直接用字符串大数比较的方法比较大小
cFlag = 1;
if (A.size() < B.size() ||
(A.size() == B.size() && A < B))
{
swap(A, B);
cFlag = -1;
}
// 转换为数字并翻转存入数组
aLen = A.size();
bLen = B.size();
cLen = max(aLen, bLen); // 相加的结果,在进位之前的长度
for (int i = 0; i < aLen; i++)
a[aLen - i - 1] = A[i] - '0';
for (int i = 0; i < bLen; i++)
b[bLen - i - 1] = B[i] - '0';
// (可选)数组清零
for (int i = aLen; i < cLen; i++)
a[i] = 0;
for (int i = bLen; i < cLen; i++)
b[i] = 0;
for (int i = 0; i < cLen; i++)
c[i] = 0;
// 相减
for (int i = 0; i < cLen; i++)
c[i] = a[i] - b[i];
// 借位
for (int i = 0; i < cLen - 1; i++)
if (c[i] < 0)
{
c[i + 1]--;
c[i] += 10;
}
// 前导 0 去除
while (cLen > 1 && c[cLen - 1] == 0)
cLen--;
// 输出
if (cFlag == -1)
cout << "-";
for (int i = cLen - 1; i >= 0; i--)
cout << c[i];
return 0;
}
A*B
#include <bits/stdc++.h>
using namespace std;
const int LEN = 200;
string A, B;
int aLen, bLen, cLen;
int a[LEN + 5], b[LEN + 5], c[LEN + LEN + 5];
int main()
{
// 以字符串形式输入
cin >> A >> B;
// 转换为数字并翻转存入数组
aLen = A.size();
bLen = B.size();
cLen = aLen + bLen - 1; // 相乘的结果,在进位之前的长度
for (int i = 0; i < aLen; i++)
a[aLen - i - 1] = A[i] - '0';
for (int i = 0; i < bLen; i++)
b[bLen - i - 1] = B[i] - '0';
// 相乘
for (int i = 0; i < aLen; i++)
for (int j = 0; j < bLen; j++)
c[i + j] += a[i] * b[j];
// 进位
for (int i = 0; i < cLen - 1; i++)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
// 最高位扩展
while (c[cLen - 1] >= 10)
{
c[cLen] = c[cLen - 1] / 10;
c[cLen - 1] %= 10;
cLen++;
}
// 前导 0 去除
while (cLen > 1 && c[cLen - 1] == 0)
cLen--;
// 输出
for (int i = cLen - 1; i >= 0; i--)
cout << c[i];
return 0;
}
A/B
#include <bits/stdc++.h>
using namespace std;
const int LEN = 300;
string A, B;
int cFlag;
int aLen, bLen, cLen;
int a[LEN + 5], b[LEN + 5], c[LEN + 5];
// 比大小,比较 a 的 up~down 这些位置是否大于等于 b
// 保证没有多余的前导 0
bool cmp(int up, int down)
{
if (up - down + 1 < bLen)
return false;
if (up - down + 1 > bLen)
return true;
for (int i = up; i >= down; i--)
{
if (a[i] < b[i - down])
return false;
if (a[i] > b[i - down])
return true;
}
return true;
}
// 比大小,将 a 的 up~down 这些位置减去 b
// 保证没有多余的前导 0
void sub(int up, int down)
{
for (int i = 0; i < bLen; i++)
a[down + i] -= b[i];
for (int i = down; i <= up; i++)
if (a[i] < 0)
{
a[i + 1]--;
a[i] += 10;
}
}
int main()
{
// 以字符串形式输入
cin >> A >> B;
// 转换为数字并翻转存入数组
aLen = A.size();
bLen = B.size();
cLen = aLen; // 商去除前导 0 之前的长度
for (int i = 0; i < aLen; i++)
a[aLen - i - 1] = A[i] - '0';
for (int i = 0; i < bLen; i++)
b[bLen - i - 1] = B[i] - '0';
// A / B = C,余数留在 A 里面
int up = aLen - 1;
for (int down = aLen - 1; down >= 0; down--)
{
while (up > down && a[up] == 0)
up--;
while (cmp(up, down))
{
c[down]++;
sub(up, down);
while (up > down && a[up] == 0)
up--;
}
}
// 去除前导 0
while (cLen > 1 && c[cLen - 1] == 0)
cLen--;
while (aLen > 1 && a[aLen - 1] == 0)
aLen--;
// 输出
for (int i = cLen - 1; i >= 0; i--)
cout << c[i];
cout << "\n";
for (int i = aLen - 1; i >= 0; i--)
cout << a[i];
cout << "\n";
return 0;
}
- 参加人数
- 2
- 创建人