高精度加法:
#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
#include<math.h>
#include<stack>//添加栈
#include<ctype.h>
#include<cstdlib>
#define pritnf printf
#define itn int
#define INF 10234567111
#define MAX 2000000
using namespace std;
#define str string
#define ll long long int
#define f float
#define ff double
//字符串类型是string ceil()向上取整,C++的正常逻辑是向下取整
int main() {
//高精度加法
//把数放到数组里面加法
// 12
// 39
// 51
// 50
// 60
// 110
string n, m; //输入两个值
cin >> n >> m;
//按照倒数放到两个数组里
int a[100] = { 0 }, b[100] = { 0 }, c[100] = { 0 };
//倒序放入
int len1 = n.size(), len2 = m.size();
for (int i = 0; i < len1; ++i) a[i] = n[len1 - 1 - i] - '0';
for (int i = 0; i < len2; ++i) b[i] = m[len2 - 1 - i] - '0';
//相加放到结果数组c中
int maxn = max(len1, len2);
for (int i = 0; i < maxn; ++i) {
c[i] += a[i] + b[i];//各个位相加 11,4
c[i + 1] = c[i] / 10;
c[i] %= 10;//如果有位置上大于10,就进位
}
//去掉前置0
maxn++;
while (c[maxn-1] == 0 && maxn > 1) maxn--;
//因为是逆序,所以需要倒着输出
for (int i = maxn - 1; i >= 0; --i) cout << c[i];
return 0;
}
高精度减法:
#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
#include<math.h>
#include<stack>//添加栈
#include<ctype.h>
#include<cstdlib>
#define pritnf printf
#define itn int
#define INF 10234567111
#define MAX 2000000
using namespace std;
#define str string
#define ll long long int
#define f float
#define ff double
//字符串类型是string ceil()向上取整,C++的正常逻辑是向下取整
int main() {
//高精度加法
//把数放到数组里面加法
// 12
// 39
// 51
// 50
// 60
// 110
string n, m; //输入两个值
cin >> n >> m;
//按照倒数放到两个数组里
int a[100] = { 0 }, b[100] = { 0 }, c[100] = { 0 };
//相减的话,找到较大数减去较小数会好算一点
int flag = 0;
//倒序放入
int len1 = n.size(), len2 = m.size();
if (len1 < len2 || len1 == len2 && atoi(n.c_str()) < atoi(m.c_str())){
flag=1;
swap(n,m);
}//把n作为较大数
for (int i = 0; i < len1; ++i) a[i] = n[len1 - 1 - i] - '0';
for (int i = 0; i < len2; ++i) b[i] = m[len2 - 1 - i] - '0';
//相加放到结果数组c中
int maxn = max(len1, len2);
for (int i = 0; i < maxn; ++i) {
//如果小了,就找前面借
if (a[i] < b[i]) {
c[i] = a[i] + 10 - b[i];
a[i + 1] = a[i + 1] - 1;
}else{
c[i] = a[i] - b[i];
}
}
//去掉前置0
maxn++;
while (c[maxn-1] == 0 && maxn > 1) maxn--;
if (flag) cout << "-";//如果是负数就加一个负号
//因为是逆序,所以需要倒着输出
for (int i = maxn - 1; i >= 0; --i) cout << c[i];
return 0;
}
高精度乘法:
#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
#include<math.h>
#include<stack>//添加栈
#include<ctype.h>
#include<cstdlib>
#define pritnf printf
#define itn int
#define INF 10234567111
#define MAX 2000000
using namespace std;
#define str string
#define ll long long int
#define f float
#define ff double
//字符串类型是string ceil()向上取整,C++的正常逻辑是向下取整
int main() {
//高精度加法
//把数放到数组里面加法
// 12
// 39
// 51
// 50
// 60
// 110
string n, m; //输入两个值
cin >> n >> m;
//按照倒数放到两个数组里
int a[100] = { 0 }, b[100] = { 0 }, c[100] = { 0 };
//相减的话,找到较大数减去较小数会好算一点
int flag = 0;
//倒序放入
int len1 = n.size(), len2 = m.size();
/*
if (len1 < len2 || len1 == len2 && atoi(n.c_str()) < atoi(m.c_str())){
flag=1;
swap(n,m);
}
*/
// 41
// 4
// 164
for (int i = 0; i < len1; ++i) a[i] = n[len1 - 1 - i] - '0';
for (int i = 0; i < len2; ++i) b[i] = m[len2 - 1 - i] - '0';
int maxn = max(len1, len2);
for (int i = 0; i < len1; ++i) {
for (int j = 0; j < len2; ++j) {
c[i + j] += a[i] * b[j];//15 13 51*31
}
}
maxn=len1+len2;
for (int i = 0; i < maxn; ++i) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
//去掉前置0
while (c[maxn-1] == 0 && maxn > 1) maxn--;
if (flag) cout << "-";//如果是负数就加一个负号
//因为是逆序,所以需要倒着输出
for (int i = maxn - 1; i >= 0; --i) cout << c[i];
return 0;
}
高精度阶乘
#include<bits/stdc++.h>
#include<ctype.h>
using namespace std;
int main()
{
int a[100000]={0};
int n;
cin>>n;
a[0]=1;
for (int i=2;i<=n;++i)
{
int c=0;
for (int j=0;j<10000;++j)
{
int s=a[j]*i+c;
a[j]=s%10;
c=s/10;
}
}
int cnt;
for (cnt=9999;cnt>0;cnt--)
{
if (a[cnt])break;
}
for (int i=cnt;i>=0;--i)
{
cout<<a[i];
}
}