js bigint 有无内置的加减乘除运算
时间: 2024-09-30 18:13:47 浏览: 23
JavaScript 的 BigInt 类型是为了处理超出 Number 类型范围的大整数而引入的。BigInt 变量可以存储任意大的整数,包括那些无法表示为普通 JavaScript 整数的数值。然而,BigInt 本身并不提供内置的加减乘除运算符,比如 `+`, `-`, `*` 和 `/`。
在使用 BigInt 进行算术操作时,你需要使用特殊的方法或者运算符:
1. `add(a: bigint, b: bigint)`: `a + b`
2. `sub(a: bigint, b: bigint)`: `a - b`
3. `mul(a: bigint, b: bigint)`: `a * b`
4. `div(a: bigint, b: bigint)` 或者 `a / b`: 对于除法,需要显式地使用这两个方法,因为 JavaScript 的常规 `/` 操作符不会自动提升到 BigInt。
例如:
```javascript
let a = BigInt('1234567890123456789');
let b = BigInt('9876543210987654321');
console.log(a.add(b)); // 加法
console.log(a.sub(b)); // 减法
console.log(a.mul(b)); // 乘法
console.log(a.div(b)); // 除法
```
相关问题
大整数的加减乘除运算,使用C语言
可以使用C语言的高精度库来进行大整数的加减乘除运算。其中比较常用的高精度库有GMP、BigInt、TTMath等。这些库都提供了丰富的API,可以方便地进行大整数的运算。例如,使用GMP库进行大整数的加法运算可以使用以下代码:
```c
#include <gmp.h>
int main() {
mpz_t a, b, c;
mpz_init(a);
mpz_init(b);
mpz_init(c);
mpz_set_str(a, "123456789012345678901234567890", 10);
mpz_set_str(b, "987654321098765432109876543210", 10);
mpz_add(c, a, b);
gmp_printf("a + b = %Zd\n", c);
mpz_clear(a);
mpz_clear(b);
mpz_clear(c);
return 0;
}
```
这段代码中,我们使用了GMP库中的mpz_t类型来表示大整数,使用mpz_init函数来初始化这些变量,使用mpz_set_str函数来将字符串转换为大整数,使用mpz_add函数来进行加法运算,最后使用gmp_printf函数来输出结果。类似地,我们也可以使用GMP库进行减法、乘法、除法等运算。
高精加减乘除用c++写出来
当然可以,以下是一个简单的高精度加减乘除的 C 代码示例:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000
typedef struct {
int len;
int num[MAX_LEN];
} BigInt;
void init(BigInt *a) {
memset(a->num, 0, sizeof(a->num));
a->len = 0;
}
void assign(BigInt *a, char *s) {
init(a);
int len = strlen(s);
for (int i = len - 1, j = 0, k = 1; i >= 0; i--) {
a->num[j] += (s[i] - '0') * k;
if (k == 10000) {
j++;
k = 1;
} else {
k *= 10;
}
}
a->len = len / 4 + 1;
while (a->len > 1 && a->num[a->len - 1] == 0) {
a->len--;
}
}
void print(BigInt *a) {
printf("%d", a->num[a->len - 1]);
for (int i = a->len - 2; i >= 0; i--) {
printf("%04d", a->num[i]);
}
printf("\n");
}
int compare(BigInt *a, BigInt *b) {
if (a->len != b->len) {
return a->len - b->len;
}
for (int i = a->len - 1; i >= 0; i--) {
if (a->num[i] != b->num[i]) {
return a->num[i] - b->num[i];
}
}
return 0;
}
void add(BigInt *a, BigInt *b, BigInt *c) {
init(c);
int carry = 0;
for (int i = 0; i < a->len || i < b->len; i++) {
int sum = a->num[i] + b->num[i] + carry;
c->num[c->len++] = sum % 10000;
carry = sum / 10000;
}
if (carry > 0) {
c->num[c->len++] = carry;
}
}
void sub(BigInt *a, BigInt *b, BigInt *c) {
init(c);
int borrow = 0;
for (int i = 0; i < a->len || i < b->len; i++) {
int diff = a->num[i] - b->num[i] - borrow;
if (diff < 0) {
diff += 10000;
borrow = 1;
} else {
borrow = 0;
}
c->num[c->len++] = diff;
}
while (c->len > 1 && c->num[c->len - 1] == 0) {
c->len--;
}
}
void mul(BigInt *a, BigInt *b, BigInt *c) {
init(c);
for (int i = 0; i < a->len; i++) {
int carry = 0;
for (int j = 0; j < b->len; j++) {
int sum = a->num[i] * b->num[j] + c->num[i + j] + carry;
c->num[i + j] = sum % 10000;
carry = sum / 10000;
}
if (carry > 0) {
c->num[i + b->len] += carry;
}
}
c->len = a->len + b->len;
while (c->len > 1 && c->num[c->len - 1] == 0) {
c->len--;
}
}
void div(BigInt *a, BigInt *b, BigInt *c, BigInt *d) {
init(c);
init(d);
for (int i = a->len - 1; i >= 0; i--) {
d->num[0] = a->num[i];
d->len = 1;
int left = 0, right = 9999, mid;
while (left <= right) {
mid = (left + right) / 2;
BigInt tmp, mul;
init(&tmp);
init(&mul);
tmp.num[0] = mid;
tmp.len = 1;
mul(&tmp, b, &mul);
if (compare(&mul, d) <= 0) {
left = mid + 1;
} else {
right = mid - 1;
}
}
c->num[i] = right;
BigInt tmp, mul, sub;
init(&tmp);
init(&mul);
init(&sub);
tmp.num[0] = right;
tmp.len = 1;
mul(&tmp, b, &mul);
sub(a, &mul, &sub);
assign(a, "");
add(&sub, &tmp, a);
}
while (c->len > 1 && c->num[c->len - 1] == 0) {
c->len--;
}
}
int main() {
BigInt a, b, c, d;
char s1[MAX_LEN], s2[MAX_LEN];
scanf("%s%s", s1, s2);
assign(&a, s1);
assign(&b, s2);
add(&a, &b, &c);
sub(&a, &b, &c);
mul(&a, &b, &c);
div(&a, &b, &c, &d);
print(&c);
print(&d);
return 0;
}
```
这个代码实现了高精度加减乘除四个基本运算,可以处理超过 long long 范围的整数。