如何用c++高精度求2的n次方减2
时间: 2023-09-12 15:10:56 浏览: 204
使用精度库可以实现高精度计算,以下是使用自己实现高精度库的方法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 2000
//高精度加法
void add(char *a, char *b, char *res) {
int la = strlen(a), lb = strlen(b), lc = 0, carry = 0;
for (int i = la - 1, j = lb - 1; i >= 0 || j >= 0 || carry; i--, j--) {
int da = i >= 0 ? a[i] - '0' : 0;
int db = j >= 0 ? b[j] - '0' : 0;
int dc = da + db + carry;
res[lc++] = dc % 10 + '0';
carry = dc / 10;
}
res[lc] = '\0';
int lres = strlen(res);
for (int i = 0; i < lres / 2; i++) {
char tmp = res[i];
res[i] = res[lres - i - 1];
res[lres - i - 1] = tmp;
}
}
//高精度减法
void sub(char *a, char *b, char *res) {
int la = strlen(a), lb = strlen(b), lc = 0, borrow = 0;
for (int i = la - 1, j = lb - 1; i >= 0 || j >= 0; i--, j--) {
int da = i >= 0 ? a[i] - '0' : 0;
int db = j >= 0 ? b[j] - '0' : 0;
int dc = da - db - borrow;
if (dc < 0) {
dc += 10;
borrow = 1;
} else {
borrow = 0;
}
res[lc++] = dc + '0';
}
while (lc > 1 && res[lc - 1] == '0') lc--;
res[lc] = '\0';
int lres = strlen(res);
for (int i = 0; i < lres / 2; i++) {
char tmp = res[i];
res[i] = res[lres - i - 1];
res[lres - i - 1] = tmp;
}
}
int main() {
int n;
scanf("%d", &n);
//计算2的n次方
char num[MAX_LEN] = "1";
for (int i = 1; i <= n; i++) {
char tmp[MAX_LEN];
mul(num, "2", tmp);
strcpy(num, tmp);
}
//计算2的n次方减2
char sub_num[MAX_LEN];
sub(num, "2", sub_num);
printf("%s\n", sub_num);
return 0;
}
```
在上面的代码中,使用了两个自己实现的高精度函数:add和sub。其中add函数是实现了高精度加法,sub函数实现了高精度减法。在主函数中,首先读入n,然后计算2的n次方,最后用2的n次方减去2,得到最终结果。
阅读全文