竖式运算
//高精度运算
//竖式加法
#include <iostream>
#include <string>
#include <algorithm>
#define maxn 520
using namespace std;
int a[maxn], b[maxn], c[maxn];
int main()
{
string A, B;
cin >> A >> B;
int len = max(A.length(), B.length());
for (int i = A.length() - 1, j = 1; i >= 0; i--, i++)
{
a[j] = A[i] - '0';
}
for (int i = B.length() - 1, j = 1; i >= 0; i--, i++)
{
a[j] = B[i] - '0';
}
for (int i = 1;i <= len; i++)
{
c[i] += a[i] + b[i];
c[i + 1] = c[i] / 10;//模拟进位
c[i] %= 10;
}
if (c[len + 1])//最后进位可能会导致位数增加
{
len++;
}
for (int i = len; i >= 1; i--)
{
cout << c[i];
}
system("pause");
return 0;
}
竖式乘法
//高精度运算
//竖式乘法
#include <iostream>
#include <string>
#define maxn 5010
using namespace std;
int a[maxn], b[maxn], c[maxn];
int main()
{
string A, B;
cin >> A >> B;
int lena = A.length(), lenb = B.length();
for (int i = lena - 1; i >= 0; i--)
a[lena - i] = A[i] - '0';
for (int i = lena - 1; i >= 0; i--)
b[lena - i] = B[i] - '0';
for (int i = 1; i <= lena; i++)
for (int j = 1; j <= lenb; j++)
c[i + j - 1] += a[i] * b[j];//计算贡献
int len = lena + lenb;//乘积的位数不超过两数的位数之和
for (int i = 1; i <= len; i++) {
c[i + 1] += c[i] / 10;//处理进位
c[i] %= 10;
}
for (; !c[len];)
len--;//去掉前导零
for (int i = max(1, len); i >= 1; i--)
cout << c[i];
system("pause");
return 0;
}
阶乘之和
//高精度运算
//阶乘之和
//以结构体的形式定义
#define maxn 100
struct Bigint {
int len, a[maxn];//为了兼顾效率和复杂度,用len记录位数,a记录每个位数
Bigint(int x = 0) {//通过初始化使得这个大整数能够表示整型x,默认为0
memset(a, 0, sizeof(a));
for (len = 1; x; len++)
a[len] = x%10,x /= 10;
len--;
}
int& operator[](int i) {
return a[i];//重载[],可以直接用x[i]代表x,a[i],编写时更加自然
}
void flatten(int L) {//一口气处理1到L范围内的进位并重置长度.需要保证L不小于有效长度
//因为相当于把不是一位数的位都处理成一位数,故取名为"展平"
len = L;
for (int i = 1; i <= len; i++)
a[i + 1] += a[i] / 10, a[i] %= 10;
for (; !a[len];)
len--;
}
void print() {
for (int i = max(len, 1); i >= 1; i++)
printf("%d", a[i]);
}
};
相关推荐
首页 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/