-
大整数加法
- 输入格式
- 有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0。
- 输出格式
- 一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能输出为 0342。
- 样例输入复制
- 22222222222222222222
- 33333333333333333333
- 样例输出复制
- 55555555555555555555
- 代码
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <string>
int max(int a, int b) {//这个函数其实也可以不用谢
//调用algorithm里的max函数也可以
if (a > b) {
return a;
}
else {
return b;
}
}
using namespace std;
int main() {
string num1, num2; //俩个数(字符串)
cin >> num1 >> num2;
int a[2000] = { 0 }; //存放a中数字
int b[2000] = { 0 }; //存放b中数字
int d[2000] = { 0 }; //存放进位
if (num1 == "0" && num2 == "0") {
cout << 0 << endl;
}
else {
int len1, len2;
len1 = num1.size(); //num1的长度
len2 = num2.size(); //num2的长度
for (int i = 0; i < len1; i++) { //存放num1中数字
a[i] = num1[len1 - 1 - i] - '0';
}
for (int j = 0; j < len2; j++) { //存放num2中数字
b[j] = num2[len2 - 1 - j] - '0';
}
int len = max(len1, len2);
for (int i = 0; i <= len; i++) { //每位数的运算
if (a[i] + b[i] + d[i] < 10) {
a[i] = a[i] + b[i] + d[i];
}
else {
d[i + 1] = (a[i] + b[i] + d[i]) / 10; //进位
a[i] = (a[i] + b[i] + d[i]) % 10;
}
}
int flag = 1;
for (int i = len + 2; i >= 0; ) { //向前多处理的数字
if (a[i] == 0 && flag == 1) {
i--;
}
else {
cout << a[i];
i--;
flag = 0;
}
}
}
return 0;
}
-
大整数减法
-
求两个大的正整数相减的差。
- 输入格式
- 共 22 行,第 11 行是被减数 aa,第 22 行是减数 b(a > b)b(a>b)。每个大整数不超过 200200 位,不会有多余的前导零。
- 输出格式
- 一行,即所求的差。
- 样例输入
- 9999999999999999999999999999999999999
- 9999999999999
- 样例输出
- 9999999999999999999999990000000000000
- 代码
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <string>
int max(int a, int b) {//可以不用写max函数
//调用algorithm里的max也可以
if (a > b) {
return a;
}
else {
return b;
}
}
using namespace std;
int main() {
string num1, num2; //俩个数(字符串)
cin >> num1 >> num2;
int a[2000] = { 0 }; //存放a中数字
int b[2000] = { 0 }; //存放b中数字
int len1, len2;
len1 = num1.size(); //num1的长度
len2 = num2.size(); //num2的长度
for (int i = 0; i < len1; i++) { //存放num1中数字
a[i] = num1[len1 - 1 - i] - '0';
}
for (int j = 0; j < len2; j++) { //存放num2中数字
b[j] = num2[len2 - 1 - j] - '0';
}
int len = max(len1, len2);
for (int i = 0; i < len; i++) { //每位数的运算
if (a[i] >= b[i] ) {
a[i] = a[i] - b[i];
}
else {
a[i] = a[i] + 10 - b[i]; //向高位借一位
a[i + 1] -= 1;
}
}
for (int i = len - 1 ; i >= 0; i--) {
cout << a[i];
}
return 0;
}
- 计算2的n次方(高精度运算)
- 任意给定一个正整数 N(N≤100),计算 22 的 N 次方的值
- 输入格式
- 输入一个正整数 N
- 输出格式
- 输出 2 的 N 次方的值
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <string>
using namespace std;
int main() {
int n; //求2的n次方
cin >> n;
int flag = 0;
int a[101] = { 0 }; //存放进位
int mul[100] = { 1 }; //存放结果
for (int i = 0; i < n; i++) {
flag = 0;
int a[101] = { 0 }; //存放进位
for (int j = 0; j < 100; j++) {
if (mul[j] * 2 + a[j] >= 10) { //需要进位
a[j + 1] = mul[j] * 2 / 10; //进位
mul[j] = mul[j] * 2 % 10 + a[j];
flag++;
}
else mul[j] = mul[j] * 2 + a[j];
if (mul[j] == 0 && j > flag + 17) break;//极限值17,往上都可以
}
}
int s = 1;
for (int i = flag + 19; i >= 0; ) { //极限值19
if (mul[i] == 0 && s == 1) {
i--;
}
else {
cout << mul[i];
s = 0;
i--;
}
}
return 0;
}