C++高精度结构体
简单介绍
这是一个使用起来很方便的高精度结构体,可以直接当 int 用,可以进行高精度之间的运算和高精度与单精度的运算,支持加减乘除以及取模,输入输出不用单独写 for 循环,平时练习可以复制,(但考场上你根本背不下的,放弃吧)
代码实现
含注释详解版(点击查看)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1005; // 最大位数,可根据需要调整
struct big_int {
int num[N]; // 倒序存储,num[1]为个位
long long len; // 当前长度(位数)
// 构造函数:默认置零
big_int(long long x = 0) {
memset(num, 0, sizeof num);
len = 0;
if (x == 0) {
len = 1;
num[1] = 0;
return;
}
while (x > 0) {
num[++len] = x % 10;
x /= 10;
}
if (len == 0) len = 1; // 处理 x=0 的情况
}
// 从字符串构造(方便输入)
big_int(const string& s) {
memset(num, 0, sizeof num);
len = s.size();
for (int i = 0; i < len; i++)
num[len - i] = s[i] - '0'; // 倒序存储
}
// 辅助函数:去除前导零并修正长度
void trim() {
while (len > 1 && num[len] == 0) len--;
if (len == 0) { len = 1; num[1] = 0; }
}
// ---------- 比较运算符(用于除法和取模) ----------
friend bool operator == (const big_int& a, const big_int& b) {
if (a.len != b.len) return false;
for (int i = 1; i <= a.len; i++)
if (a.num[i] != b.num[i]) return false;
return true;
}
friend bool operator < (const big_int& a, const big_int& b) {
if (a.len != b.len) return a.len < b.len;
for (int i = a.len; i >= 1; i--) {
if (a.num[i] != b.num[i]) return a.num[i] < b.num[i];
}
return false; // 相等
}
friend bool operator > (const big_int& a, const big_int& b) { return b < a; }
friend bool operator <= (const big_int& a, const big_int& b) { return !(a > b); }
friend bool operator >= (const big_int& a, const big_int& b) { return !(a < b); }
friend bool operator != (const big_int& a, const big_int& b) { return !(a == b); }
// ---------- 加法 ----------
// 高精 + 高精
friend big_int operator + (const big_int& a, const big_int& b) {
big_int res;
res.len = max(a.len, b.len);
int carry = 0;
for (int i = 1; i <= res.len; i++) {
int sum = a.num[i] + b.num[i] + carry;
res.num[i] = sum % 10;
carry = sum / 10;
}
if (carry) res.num[++res.len] = carry;
res.trim();
return res;
}
// 高精 + 单精(int)
friend big_int operator + (const big_int& a, int b) {
big_int bb(b);
return a + bb;
}
friend big_int operator + (int a, const big_int& b) {
return b + a;
}
// 复合赋值
big_int& operator += (const big_int& other) {
*this = *this + other;
return *this;
}
big_int& operator += (int other) {
*this = *this + other;
return *this;
}
// ---------- 减法(保证 a >= b) ----------
friend big_int operator-(const big_int& a, const big_int& b) {
// 默认 a >= b,若小于则返回 0(或可抛出异常)
if (a < b) return big_int(0);
big_int res;
res.len = a.len;
int borrow = 0;
for (int i = 1; i <= a.len; i++) {
int diff = a.num[i] - b.num[i] - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else borrow = 0;
res.num[i] = diff;
}
res.trim();
return res;
}
friend big_int operator - (const big_int& a, int b) {
big_int bb(b);
return a - bb;
}
friend big_int operator - (int a, const big_int& b) {
big_int aa(a);
return aa - b;
}
big_int& operator -= (const big_int& other) {
*this = *this - other;
return *this;
}
big_int& operator -= (int other) {
*this = *this - other;
return *this;
}
// ---------- 乘法 ----------
friend big_int operator*(const big_int& a, const big_int& b) {
big_int res;
res.len = a.len + b.len;
for (int i = 1; i <= a.len; i++) {
for (int j = 1; j <= b.len; j++) {
res.num[i + j - 1] += a.num[i] * b.num[j];
res.num[i + j] += res.num[i + j - 1] / 10;
res.num[i + j - 1] %= 10;
}
}
res.trim();
return res;
}
friend big_int operator * (const big_int& a, int b) {
big_int bb(b);
return a * bb;
}
friend big_int operator * (int a, const big_int& b) {
return b * a;
}
big_int& operator *= (const big_int& other) {
*this = *this * other;
return *this;
}
big_int& operator *= (int other) {
*this = *this * other;
return *this;
}
// ---------- 除法(高精 / 高精,向下取整) ----------
friend big_int operator/(const big_int& a, const big_int& b) {
if (b == big_int(0)) {
cerr << "Error: Division by zero!" << "\n";
return big_int(0);
}
if (a < b) return big_int(0);
big_int res, rmdr;
res.len = a.len;
// 从高位到低位试商
for (int i = a.len; i >= 1; i--) {
// 将当前余数整体左移一位(乘以10)并加上当前位
for (int j = rmdr.len; j >= 1; j--)
rmdr.num[j + 1] = rmdr.num[j];
rmdr.len++;
rmdr.num[1] = a.num[i];
rmdr.trim();
// 二分查找商 q(0~9)
int q = 0, l = 0, r = 9;
while (l <= r) {
int mid = (l + r) / 2;
big_int tmp = b * mid;
if (tmp <= rmdr) {
q = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
res.num[i] = q;
// 更新余数:rmdr = rmdr - b * q
big_int sub = b * q;
rmdr = rmdr - sub;
}
res.trim();
return res;
}
friend big_int operator / (const big_int& a, int b) {
big_int bb(b);
return a / bb;
}
friend big_int operator / (int a, const big_int& b) {
big_int aa(a);
return aa / b;
}
big_int& operator /= (const big_int& other) {
*this = *this / other;
return *this;
}
big_int& operator /= (int other) {
*this = *this / other;
return *this;
}
// ---------- 取模(高精 % 高精) ----------
friend big_int operator % (const big_int& a, const big_int& b) {
if (b == big_int(0)) {
cerr << "Error: Modulo by zero!" << "\n";
return big_int(0);
}
if (a < b) return a;
// 利用除法:a % b = a - (a / b) * b
big_int quotient = a / b;
big_int product = quotient * b;
return a - product;
}
friend big_int operator % (const big_int& a, int b) {
big_int bb(b);
return a % bb;
}
friend big_int operator % (int a, const big_int& b) {
big_int aa(a);
return aa % b;
}
big_int& operator %= (const big_int& other) {
*this = *this % other;
return *this;
}
big_int& operator %= (int other) {
*this = *this % other;
return *this;
}
// ---------- 输出流 ----------
friend ostream& operator << (ostream& out, const big_int& x) {
for (int i = x.len; i >= 1; i--)
out << x.num[i];
return out;
}
};
// 示例使用
int main() {
big_int a("12345678901234567890");
big_int b("98765432109876543210");
big_int c = a + b;
cout << "a + b = " << c << "\n";
big_int d = a * 12345;
cout << "a * 12345 = " << d << "\n";
big_int e = b / 3;
cout << "b / 3 = " << e << "\n";
big_int f = b % 100;
cout << "b % 100 = " << f << "\n";
return 0;
}
无注释版
Tips:无main函数。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1005;
struct big_int {
int num[N];
long long len;
big_int(long long x = 0) {
memset(num, 0, sizeof num);
len = 0;
if (x == 0) {
len = 1; num[1] = 0;
return;
}
while (x > 0) {
num[++len] = x % 10; x /= 10;
}
if (len == 0) len = 1;
}
big_int(const string& s) {
memset(num, 0, sizeof num);
len = s.size();
for (int i = 0; i < len; i++) num[len - i] = s[i] - '0';
}
void trim() {
while (len > 1 && num[len] == 0) len--;
if (len == 0) { len = 1; num[1] = 0; }
}
friend bool operator == (const big_int& a, const big_int& b) {
if (a.len != b.len) return 0;
for (int i = 1; i <= a.len; i++) if (a.num[i] != b.num[i]) return 0;
return true;
}
friend bool operator < (const big_int& a, const big_int& b) {
if (a.len != b.len) return a.len < b.len;
for (int i = a.len; i >= 1; i--) {
if (a.num[i] != b.num[i]) return a.num[i] < b.num[i];
}
return 0;
}
friend bool operator > (const big_int& a, const big_int& b) { return b < a; }
friend bool operator <= (const big_int& a, const big_int& b) { return !(a > b); }
friend bool operator >= (const big_int& a, const big_int& b) { return !(a < b); }
friend bool operator != (const big_int& a, const big_int& b) { return !(a == b); }
friend big_int operator + (const big_int& a, const big_int& b) {
big_int res;
res.len = max(a.len, b.len);
int carry = 0;
for (int i = 1; i <= res.len; i++) {
int sum = a.num[i] + b.num[i] + carry;
res.num[i] = sum % 10;
carry = sum / 10;
}
if (carry) res.num[++res.len] = carry;
res.trim();
return res;
}
friend big_int operator + (const big_int& a, int b) {
big_int bb(b);
return a + bb;
}
friend big_int operator + (int a, const big_int& b) {
return b + a;
}
big_int& operator += (const big_int& other) {
*this = *this + other;
return *this;
}
big_int& operator += (int other) {
*this = *this + other;
return *this;
}
friend big_int operator-(const big_int& a, const big_int& b) {
if (a < b) return big_int(0);
big_int res; res.len = a.len;
int borrow = 0;
for (int i = 1; i <= a.len; i++) {
int diff = a.num[i] - b.num[i] - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else borrow = 0;
res.num[i] = diff;
}
res.trim();
return res;
}
friend big_int operator - (const big_int& a, int b) {
big_int bb(b);
return a - bb;
}
friend big_int operator - (int a, const big_int& b) {
big_int aa(a);
return aa - b;
}
big_int& operator -= (const big_int& other) {
*this = *this - other;
return *this;
}
big_int& operator -= (int other) {
*this = *this - other;
return *this;
}
friend big_int operator*(const big_int& a, const big_int& b) {
big_int res;
res.len = a.len + b.len;
for (int i = 1; i <= a.len; i++) {
for (int j = 1; j <= b.len; j++) {
res.num[i + j - 1] += a.num[i] * b.num[j];
res.num[i + j] += res.num[i + j - 1] / 10;
res.num[i + j - 1] %= 10;
}
}
res.trim();
return res;
}
friend big_int operator * (const big_int& a, int b) {
big_int bb(b);
return a * bb;
}
friend big_int operator * (int a, const big_int& b) {
return b * a;
}
big_int& operator *= (const big_int& other) {
*this = *this * other;
return *this;
}
big_int& operator *= (int other) {
*this = *this * other;
return *this;
}
friend big_int operator/(const big_int& a, const big_int& b) {
if (b == big_int(0)) {
cerr << "Error: Division by zero!" << "\n";
return big_int(0);
}
if (a < b) return big_int(0);
big_int res, rmdr;
res.len = a.len;
for (int i = a.len; i >= 1; i--) {
for (int j = rmdr.len; j >= 1; j--)
rmdr.num[j + 1] = rmdr.num[j];
rmdr.len++; rmdr.num[1] = a.num[i]; rmdr.trim();
int q = 0, l = 0, r = 9;
while (l <= r) {
int mid = (l + r) / 2;
big_int tmp = b * mid;
if (tmp <= rmdr) {
q = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
res.num[i] = q;
big_int sub = b * q;
rmdr = rmdr - sub;
}
res.trim();
return res;
}
friend big_int operator / (const big_int& a, int b) {
big_int bb(b);
return a / bb;
}
friend big_int operator / (int a, const big_int& b) {
big_int aa(a);
return aa / b;
}
big_int& operator /= (const big_int& other) {
*this = *this / other;
return *this;
}
big_int& operator /= (int other) {
*this = *this / other;
return *this;
}
friend big_int operator % (const big_int& a, const big_int& b) {
if (b == big_int(0)) {
cerr << "Error: Modulo by zero!" << "\n";
return big_int(0);
}
if (a < b) return a;
return a - (a / b) * b;
}
friend big_int operator % (const big_int& a, int b) {
big_int bb(b);
return a % bb;
}
friend big_int operator % (int a, const big_int& b) {
big_int aa(a);
return aa % b;
}
big_int& operator %= (const big_int& other) {
*this = *this % other;
return *this;
}
big_int& operator %= (int other) {
*this = *this % other;
return *this;
}
friend ostream& operator << (ostream& out, const big_int& x) {
for (int i = x.len; i >= 1; i--)
out << x.num[i];
return out;
}
};

浙公网安备 33010602011771号