C++数值处理算法 求高精度整数除以单精度整数的商和余数
作者:野牛程序员:2023-02-25 14:26:18C++程序设计阅读 2571
C++ 的高精度整数除以单精度整数的商和余数的实现:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
struct BigNum {
int a[MAXN], len;
BigNum() {
memset(a, 0, sizeof(a));
len = 0;
}
void init() {
memset(a, 0, sizeof(a));
len = 0;
}
void read() {
char str[MAXN];
scanf("%s", str);
len = strlen(str);
for (int i = 0; i < len; i++) {
a[i] = str[len - i - 1] - '0';
}
}
void print() {
for (int i = len - 1; i >= 0; i--) {
printf("%d", a[i]);
}
printf("\\n");
}
BigNum div(int b, int &r) { // 除法
BigNum c;
c.init();
r = 0;
for (int i = len - 1; i >= 0; i--) {
r = r * 10 + a[i];
c.a[i] = r / b;
r %= b;
}
c.len = len;
while (c.len > 1 && c.a[c.len - 1] == 0) {
c.len--;
}
return c;
}
};
int main() {
BigNum a, c;
int b, r;
a.read();
scanf("%d", &b);
c = a.div(b, r);
c.print();
printf("%d\\n", r);
return 0;
}在这个实现中,我们同样用 BigNum 结构体表示高精度数,包括了初始化、读入、输出、除法等操作。在 div 函数中,我们首先将高精度整数的每一位依次除以单精度整数,得到商和余数,然后将商保存在一个新的高精度数中返回。注意,在这个实现中,我们将高精度整数存储在数组中,并且低位存储在数组的低位,高位存储在数组的高位。
以上就是高精度整数除以单精度整数的商和余数的一个简单实现方法。
我们还可以通过以下代码实现高精度整数除以单精度整数的商和余数的运算:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 10010;
struct BigInt {
int len, s[N];
BigInt() {
memset(s, 0, sizeof(s));
len = 1;
}
BigInt(int num) {
*this = num;
}
BigInt(const char* num) {
*this = num;
}
BigInt operator = (int num) {
char s[N];
sprintf(s, "%d", num);
*this = s;
return *this;
}
BigInt operator = (const char* num) {
memset(s, 0, sizeof(s));
len = strlen(num);
for (int i = 0; i < len; i++) s[i] = num[len - i - 1] - '0';
return *this;
}
BigInt operator + (const BigInt& b) const {
BigInt c;
c.len = 0;
for (int i = 0, g = 0; g || i < max(len, b.len); i++) {
int x = g;
if (i < len) x += s[i];
if (i < b.len) x += b.s[i];
c.s[c.len++] = x % 10;
g = x / 10;
}
return c;
}
BigInt operator - (const BigInt& b) {
BigInt c;
c.len = 0;
for (int i = 0, g = 0; i < len; i++) {
int x = s[i] - g;
if (i < b.len) x -= b.s[i];
if (x >= 0) g = 0;
else {
g = 1;
x += 10;
}
c.s[c.len++] = x;
}
while (c.len > 1 && !c.s[c.len - 1]) c.len--;
return c;
}
BigInt operator * (const BigInt& b) const {
BigInt c;
c.len = len + b.len;
for (int i = 0; i < len; i++)
for (int j = 0; j < b.len; j++)
c.s[i + j] += s[i] * b.s[j];
for (int i = 0; i < c.len - 1; i++) {
c.s[i + 1] += c.s[i] / 10;
c.s[i] %= 10;
}
while (c.len > 1 && !c.s[c.len - 1]) c.len--;
return c;
}
BigInt operator / (const int& num) const {
BigInt c;
int d = 0;
for (int i = len - 1; i >= 0; i--) {
d = d * 10 + s[i];
c.s[i] = d / num;
d %= num;
}
c.len = len;
while (c.len > 1 && !c.s[c.len - 1]) c.len--;
return c;
}
int operator % (const int& num) const {
int d = 0;
for (int i = len - 1; i >= 0; i--)
d = (d * 10 + s[i]) % num;
return d;
}
};
int main() {
int a = 123456789, b = 1234;
BigInt A = a;
BigInt C = A / b;
BigInt D = A % b; printf("%d / %d = ", a, b); for (int i = C.len - 1; i >= 0; i--) printf("%d", C.s[i]); printf("\\n%d %% %d = ", a, b); printf("%d\\n", D); return 0;
}上述代码中,我们定义了一个高精度整数结构体 BigInt,并实现了加、减、乘、除和取余等运算。
在 main 函数中,我们分别测试了高精度整数除以单精度整数的商和余数。在这里,我们将单精度整数 a 赋值给 BigInt 类型的变量 A,然后对 A 进行除法和取余运算,得到商 C 和余数 D,并输出结果。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:数值处理算法:高精度除法
- 下一篇:排序的基本概念(稳定性等)
