Hochpräzise C++-Operationen (Addition, Subtraktion, Multiplikation und Division)

In C++ beträgt int 32 Bit, also 2^32-1.

Wertebereich des C/C++-Basiszahlentyps Typ
Wertebereich Ziffern
ohne Vorzeichen int 0~4294967295 10 Ziffern
int 2147483648~2147483647 10 Ziffern ohne
Vorzeichen lang 0~4294967295 10 Ziffern
lang 2147483648~2147483647 10 Ziffern lang lang
-9223372036854775808~9223372036854775807 19 Ziffern ohne Vorzeichen lang
lang 0~1844674407370955161 19 Bit
__int64 -9223372036854775808~9223372036854775807 19 Bit
ohne Vorzeichen __int64 0~18446744073709551615 20 Bit

Größere Werte können mit hoher Präzision berechnet werden.

Hier ist die Additionsoperation:

#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;
}

Subtraktionsoperation:

Achten Sie darauf, eine große Zahl zu verwenden, um die Zahl zu reduzieren. Wenn es sich um eine Dezimalzahl handelt, um die große Zahl zu reduzieren, fügen Sie ein negatives Vorzeichen hinzu. Beim Subtrahieren verwenden Sie while, um das Bit zu bestimmen, das nicht 0 ist.

Beachten Sie, dass for in der Hauptfunktion nicht um eins dekrementiert werden muss.

#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;
}

Multiplikationsoperation:

#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;
}

Abteilungsbetrieb:

#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;
}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/128713288
Recomendado
Clasificación