写个板子在这 以防以后可能会忘了
高精度加法
#include <bits/stdc++.h>
using namespace std;
string a;
string b;
string res;
int main() {
cin >> a >> b;
int len1 = a.size();
int len2 = b.size();
if (len1 < len2) {
for (int i = 0; i < len2 - len1; i++) {
a = "0" + a;
}
} else {
for (int i = 0; i < len1 - len2; i++) {
b = "0" + b;
}
}
int len = a.size();
int temp;
int cf = 0;
for (int i = len - 1; i >= 0; i--) {
temp = a[i] - '0' + b[i] - '0' + cf;
cf = temp / 10;
temp = temp % 10;
res = char(temp + '0') + res;
}
if (cf == 1) {
res = char(cf + '0') + res;
}
cout << res << endl;
return 0;
}
高精度减法
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
string a, b;
string res;
int main() {
cin >> a >> b;
int len1 = a.size(), len2 = b.size();
bool negative = false;
// 补零对齐
if (len1 < len2) {
a = string(len2 - len1, '0') + a;
len1 = len2;
} else if (len2 < len1) {
b = string(len1 - len2, '0') + b;
len2 = len1;
}
// 比较大小,确定符号
if (a < b) {
swap(a, b);
negative = true;
}
int cf = 0;
for (int i = len1 - 1; i >= 0; --i) {
int temp = (a[i] - '0') - (b[i] - '0') + cf;
cf = 0;
if (temp < 0) {
temp += 10;
cf = -1;
}
res.push_back(temp + '0');
}
// 去除前导零
while (res.size() > 1 && res.back() == '0') res.pop_back();
reverse(res.begin(), res.end());
if (negative) cout << '-';
cout << res << endl;
return 0;
}
高精度乘法
#include <bits/stdc++.h>
using namespace std;
char a1[10001],b1[10001];
int a[10001],b[10001],i,x,len,j,c[10001];
int main ()
{
cin>>a1>>b1;
int lena=strlen(a1);
int lenb=strlen(b1);
for(i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';
for(i=1;i<=lenb;i++)b[i]=b1[lenb-i]-'0';
for(i=1;i<=lenb;i++){
for(j=1;j<=lena;j++){
c[i+j-1]+=a[j]*b[i];
}
}
for(i=1;i<lena+lenb;i++){
if(c[i]>9){
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
len=lena+lenb;
while(c[len]==0&&len>1)len--;
for(i=len;i>=1;i--)cout<<c[i];
return 0;
}
高精度除法(高精除以低精)
#include <bits/stdc++.h>
using namespace std;
char a1[10001];
long long b,c[10001],d,a[10001],len,lenc;
int main ()
{
cin >>a1 >>b;
len=strlen(a1);
for (int i=1;i<=len;i++)a[i]=a1[i-1]-'0';
for (int i=1;i<=len;++i)
{
c[i]=(d*10+a[i])/b;
d=(d*10+a[i])%b;
}
lenc=1;
while (c[lenc]==0&&lenc<len)lenc++;
for (int i=lenc;i<=len;++i)cout <<c[i];
return 0;
}
阶乘之和
#include <bits/stdc++.h>
using namespace std;
int n;
int cur[205] = {0}; // 存储当前阶乘值
int res[205] = {0}; // 存储累加和
int main() {
cin >> n;
// 初始化:1! = 1
int cur_len = 1, res_len = 1;
cur[0] = 1;
res[0] = 1;
for (int i = 2; i <= n; i++) {
// 计算当前阶乘 cur = cur * i
int carry = 0;
for (int j = 0; j < cur_len; j++) {
int temp = cur[j] * i + carry;
cur[j] = temp % 10;
carry = temp / 10;
}
// 处理剩余进位
while (carry > 0) {
cur[cur_len++] = carry % 10;
carry /= 10;
}
// 将当前阶乘加到结果 res += cur
carry = 0;
int max_len = max(res_len, cur_len);
for (int j = 0; j < max_len; j++) {
int sum = res[j] + (j < cur_len ? cur[j] : 0) + carry;
res[j] = sum % 10;
carry = sum / 10;
}
// 处理剩余进位
res_len = max_len;
if (carry > 0) {
res[res_len++] = carry;
}
}
// 输出结果(高位在后需要逆序)
for (int i = res_len - 1; i >= 0; i--) {
cout << res[i];
}
return 0;
}