C++高精度运算(加减乘除)

C++中在int 是32位bit是2^32-1。

C/C++基础数字类型的取值范围
类型    取值范围    位数
unsigned   int    0~4294967295    10位
int    2147483648~2147483647    10位
unsigned long    0~4294967295    10位
long    2147483648~2147483647    10位
long long    -9223372036854775808~9223372036854775807    19位
unsigned long long    0~1844674407370955161    19位
__int64    -9223372036854775808~9223372036854775807    19位
unsigned __int64    0~18446744073709551615    20位

用高精度可以计算的更大。

下面是加法运算:

#define _CRT_SECURE_NO_WARNINGS 1	
#include<iostream>
#include<string_view>
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int A[N], B[N], C[N];
int la, lb, lc;
void add(int A[], int B[], int C[]) {
	for (int i = 0; i < lc; i++) {
		C[i] += A[i] + B[i]; //累加
		C[i + 1] += C[i] / 10; // 进位
		C[i] %= 10; //存余数
	}
	if (C[lc]) lc++; // 注意最高位的处理 lc是位长
}
int main() {
	string a, b;
	cin >> a >> b;
	la = a.size(), lb = b.size(), lc = max(la, lb); // 这里是取最高位
	for (int i = la - 1; ~i; i--) A[la - 1 - i] = a[i] - '0';
	for (int i = lb - 1; ~i; i--) B[lb - 1 - i] = b[i] - '0';
	add(A, B, C);
    for (int i = lc - 1; ~i; i--) printf("%d", C[i]);
    return 0;
}

减法运算:

注意要用大数减小数,如果是小数减大数要加负号.在减的时候要用while确定不为0的位。

在主函数中要注意for不需要减一。

#define _CRT_SECURE_NO_WARNINGS 1	
#include<iostream>
#include<string_view>
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int A[N], B[N], C[N];
int la, lb, lc;
bool cmp(int A[], int B[]) {
	if (la != lb) return la > lb;
		for (int i = la - 1; ~i; i--) {
			if (A[i] != B[i]) return A[i] > B[i];
	}
		return true;
}
void sub(int A[], int B[], int C[]) {
	for (int i = 0; i < lc; i++) {
		if (A[i] < B[i]) {
			A[i + 1]--, A[i] += 10;
		}
		C[i] = A[i] - B[i];
	}
	while (lc && C[lc] == 0) lc--;
}
int main() {
	string a, b;
	cin >> a >> b;
	la = a.size(), lb = b.size(), lc = max(la, lb); // 这里是取最高位
	for (int i = la - 1; ~i; i--) A[la - 1 - i] = a[i] - '0';
	for (int i = lb - 1; ~i; i--) B[lb - 1 - i] = b[i] - '0';
    if (!cmp(A, B)) swap(A, B), cout << "-";
	sub(A, B, C);
    for (int i = lc ; ~i; i--) printf("%d", C[i]);
    return 0;
}

乘法运算:

#define _CRT_SECURE_NO_WARNINGS 1	
#include<iostream>
#include<string_view>
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int A[N], B[N], C[N];
int la, lb, lc;
void mul(int A[], int B[], int C[]) {
	for (int i = 0; i < la; i++) {
		for (int j = 0; j < lb; j++) {
			C[i + j] += A[i] * B[j]; // 这里要注意是加
			C[i + j + 1] += C[i + j] / 10;
			C[i + j] = C[i + j] % 10;
		}
	}
	while (lc && C[lc] == 0) lc--;
}
int main() {
	string a, b;
	cin >> a >> b;
	la = a.size(), lb = b.size(), lc = la+lb; // 这里是取最高位
	for (int i = la - 1; ~i; i--) A[la - 1 - i] = a[i] - '0';
	for (int i = lb - 1; ~i; i--) B[lb - 1 - i] = b[i] - '0';
	mul(A, B, C);
	for (int i = lc; ~i; i--)
		printf("%d", C[i]);

	return 0;
}

除法运算:

#define _CRT_SECURE_NO_WARNINGS 1	
#include<iostream>
#include<string_view>
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int A[N], B[N], C[N];
int la, lb, lc;
void mul(int A[], int B[], int C[]) {
	for (int i = 0; i < la; i++) {
		for (int j = 0; j < lb; j++) {
			C[i + j] += A[i] * B[j]; // 这里要注意是加
			C[i + j + 1] += C[i + j] / 10;
			C[i + j] = C[i + j] % 10;
		}
	}
	while (lc && C[lc] == 0) lc--;
}

void div(int A[], int b, int C[]) {
	long long r = 0;
	for (int i = la - 1; ~i; i--) {
		r = r * 10 + A[i];
		C[la - 1 - i] = r / b; //从后向前
		r %= b;
	}
	reverse(C, C + lc);
	while (lc && C[lc] == 0) lc--;
}

int main() {
	string a;
	int b;
	cin >> a >> b;
	la = a.size(),  lc = la; // 这里是取最高位
	for (int i = la - 1; ~i; i--) A[la - 1 - i] = a[i] - '0';
	//for (int i = lb - 1; ~i; i--) B[lb - 1 - i] = b[i] - '0';
	//mul(A, B, C);
	div(A, b, C);
	for (int i = lc; ~i; i--)
		printf("%d", C[i]);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhi6fui/article/details/128713288