这里只给出数组的模拟 想看vector版的请 点击
除法
1.高精度除以低精度保留余数
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <unordered_map>
using namespace std;
const int N = 10010;
int a[N], b;
void init(){
string s, t;
cin >> s >> t;
a[0] = s.size(); b = stoi(t);
// 倒序存储
for(int i = 1;i <= a[0];i ++ ) a[i] = s[a[0] - i] - '0';
}
void print(int a[]){
for(int i = a[0];i >= 1;i -- ) cout << a[i];
}
void division(int a[], int b){
int r = 0;
for(int i = a[0];i >= 1;i -- ){
a[i] = r * 10 + a[i];
r = a[i] % b;
a[i] /= b;
}
while(a[0] > 0 && !a[a[0]]) a[0] -- ;
print(a);
if(r) printf("...%d", r);
}
int main(){
init();
division(a, b);
return 0;
}
2.低精度除以低精度保留小数
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <unordered_map>
using namespace std;
typedef long long LL;
unordered_map<LL, int> pos;
string division(int a, int b){
// 为了方便 直接用 LL
LL x = a, y = b;
if(x % y == 0){
return to_string(x / y);
}
string res;
// check is_neg
if((x < 0) ^ (y < 0)) res += '-';
x = abs(x), y = abs(y);
// 整数部分
res += to_string(x / y) + '.';
x %= y;
while(x){
pos[x] = res.size();
x *= 10;
res += to_string(x / y);
x %= y;
if(pos.count(x)){
res = res.substr(0, pos[x]) + '[' + res.substr(pos[x]) + ']';
printf("[]里面为循环位:\t");
break;
}
}
return res;
}
int main(){
int a, b; cin >> a >> b;
cout << division(a, b) << endl;
return 0;
}
3.高精度除以高精度保留余数
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 10010;
int a[N], b[N], c[N], tmp[N];
void init(){
memset(a, 0, sizeof a);
memset(b, 0, sizeof b);
memset(c, 0, sizeof c);
string s, t;
cin >> s >> t;
a[0] = s.size(), b[0] = t.size();
// 倒序存储
for(int i = 0;i < a[0];i ++ ) a[a[0] - i] = s[i] - '0';
for(int i = 0;i < b[0];i ++ ) b[b[0] - i] = t[i] - '0';
// 除法得到的商的位数最多为
c[0] = a[0] - b[0] + 1;
}
// 判断 a 和 b 的大小
// a > b : 1
// b > a : -1
// a = b : 0
int cmp(int a[], int b[]){
if(a[0] > b[0]) return 1;
if(a[0] < b[0]) return -1;
for(int i = a[0];i > 0;i -- ){
if(a[i] > b[i]) return 1;
if(a[i] < b[i]) return -1;
}
return 0;
}
// a - b
void sub(int a[], int b[]){
if(cmp(a, b) == 0){
// 结果为 0
a[0] = 0;
return ;
}
int t = 0;
for(int i = 1;i <= a[0];i ++ ){
a[i] -= b[i] + t;
if(a[i] < 0) t = 1;
else t = 0;
a[i] = (a[i] + 10) % 10;
}
// 更新位数
while(a[0] > 0 && !a[a[0]]) a[0] -- ;
}
// 从 j 开始往后复制 a 数组 < == > 把 a 乘 10 ^ (j - 1) 给 b
void cpy(int a[], int b[], int j){
for(int i = 1;i <= a[0];i ++ ){
b[i + j - 1] = a[i];
}
b[0] = a[0] + j - 1;
}
// 打印函数
void print(int a[]){
for(int i = a[0];i > 0;i -- ) cout << a[i];
cout << endl;
}
int main(){
init();
for(int i = c[0];i > 0;i -- ){
memset(tmp, 0, sizeof tmp);
cpy(b, tmp, i);
while(cmp(a, tmp) >= 0){
sub(a, tmp);
c[i] ++ ;
}
}
while(c[0] > 0 && !c[c[0]]) c[0] -- ;
// 商, 余数
print(c), print(a);
return 0;
}
乘法
1.高精度乘低精度
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <unordered_map>
using namespace std;
const int N = 10010;
int a[N], b;
int n;
void init(){
string s, t;
cin >> s >> t;
n = s.size(); b = stoi(t);
// 倒序存储
for(int i = 0;i < n;i ++ ) a[i] = s[n - 1 - i] - '0';
}
void mul(int a[], int b){
int t = 0;
for(int i = 0;i < n;i ++ ){
a[i] = a[i] * b + t;
t = a[i] / 10;
a[i] %= 10;
}
while(n > 0 && !a[n]) n -- ;
for(int i = n;i >= 0;i -- ) cout << a[i];
}
int main(){
init();
mul(a, b);
return 0;
}
2.高精度乘高精度
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <unordered_map>
using namespace std;
const int N = 10010;
int a[N], b[N], c[N];
int n, m;
void init(){
string s, t;
cin >> s >> t;
n = s.size(); m = t.size();
// 倒序存储
for(int i = 0;i < n;i ++ ) a[i] = s[n - 1 - i] - '0';
for(int i = 0;i < m;i ++ ) b[i] = t[m - 1 - i] - '0';
}
void mul(int a[], int b[]){
// a[i] * b[j] 存储到 c 的 i + j 位; 从 0 开始编号比较方便
for(int i = 0;i < n;i ++ )
for(int j = 0;j < m;j ++ )
c[i + j] += a[i] * b[j];
int t = 0;
for(int i = 0;i < n + m;i ++ ){
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
// 排除末尾 0
int d = n + m - 2;
while(d > 0 && !c[d]) d -- ;
for(int i = d;i >= 0;i -- ) cout << c[i];
}
int main(){
init();
mul(a, b);
return 0;
}
减法
1.高精度减高精度
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <unordered_map>
using namespace std;
const int N = 10010;
int a[N], b[N];
bool is_neg = false;
void init(){
string s, t;
cin >> s >> t;
a[0] = s.size(); b[0] = t.size();
// 倒序存储
for(int i = 1;i <= a[0];i ++ ) a[i] = s[a[0] - i] - '0';
for(int i = 1;i <= b[0];i ++ ) b[i] = t[b[0] - i] - '0';
}
void print(int a[]){
for(int i = a[0];i >= 1;i -- ) cout << a[i];
}
int cmp(int a[], int b[]){
if(a[0] > b[0]) return 1;
if(a[0] < b[0]) return -1;
for(int i = a[0];i > 0;i -- ){
if(a[i] > b[i]) return 1;
if(a[i] < b[i]) return -1;
}
return 0;
}
// a - b
void sub(int a[], int b[]){
if(cmp(a, b) == 0){
// 结果为 0
a[0] = 0;
return ;
}else if(cmp(a, b) < 0){
is_neg = true;
sub(b, a);
return ;
}
int t = 0;
for(int i = 1;i <= a[0];i ++ ){
a[i] -= b[i] + t;
if(a[i] < 0) t = 1;
else t = 0;
a[i] = (a[i] + 10) % 10;
}
// 更新位数
while(a[0] > 0 && !a[a[0]]) a[0] -- ;
if(is_neg) printf("-");
print(a);
}
int main(){
init();
sub(a, b);
return 0;
}
加法
1.高精度加高精度
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <unordered_map>
using namespace std;
const int N = 10010;
int a[N], b[N];
void init(){
string s, t;
cin >> s >> t;
a[0] = s.size(); b[0] = t.size();
// 倒序存储
for(int i = 1;i <= a[0];i ++ ) a[i] = s[a[0] - i] - '0';
for(int i = 1;i <= b[0];i ++ ) b[i] = t[b[0] - i] - '0';
}
void print(int a[]){
for(int i = a[0];i >= 1;i -- ) cout << a[i];
}
void add(int a[], int b[]){
int t = 0;
for(int i = 1;i <= max(a[0], b[0]);i ++ ){
if(i <= a[0]) t += a[i];
if(i <= b[0]) t += b[i];
a[i] = t % 10;
if(i > a[0]) a[0] ++ ;
t /= 10;
}
if(t) a[ ++ a[0]] = t;
print(a);
}
int main(){
init();
add(a, b);
return 0;
}