一、高精度减法代码
高精度减法是指两个大数相减,其中至少有一个数字长度超过 long long 类型所能表示的上限。以下是一个高精度减法的 c++ 代码示例:
#include <bits/stdc++.h> using namespace std; const int MAXN = 10010; int a[MAXN], b[MAXN], c[MAXN]; // a - b = c int lena, lenb, lenc; void print() { // 输出结果 if (lenc == 0) printf("0"); for (int i = lenc - 1; i >= 0; i--) { printf("%d", c[i]); } printf("\n"); } bool cmp(int *a, int *b, int lena, int lenb) { if (lena != lenb) return lena < lenb; for (int i = lena - 1; i >= 0; i--) { if (a[i] != b[i]) return a[i] < b[i]; } return true; } void sub(int *a, int *b, int *c, int lena, int lenb) { int borrow = 0; for (int i = 0; i < lena; i++) { c[i] = a[i] - borrow - b[i]; if (c[i] < 0) { c[i] += 10; borrow = 1; } else { borrow = 0; } } while (lenc > 0 && c[lenc - 1] == 0) lenc--; } int main() { // 读入两个大数 string sa, sb; cin >> sa >> sb; lena = sa.length(); lenb = sb.length(); for (int i = 0; i < lena; i++) a[i] = sa[lena - i - 1] - '0'; for (int i = 0; i < lenb; i++) b[i] = sb[lenb - i - 1] - '0'; if (cmp(a, b, lena, lenb)) swap(a, b), swap(lena, lenb), printf("-"); lenc = lena; sub(a, b, c, lena, lenb); print(); return 0; }
二、c++高精度减法
高精度减法需要注意以下几个问题:
1. 高精度减法需要将字符串转化为数字数组,方便进行计算。
2. 减法操作中需要判断被减数是否小于减数,以确定结果的正负。
3. 在计算的过程中,需要用一个借位值来判断是否需要借位。
4. 计算结束后需要去掉前导 0。
三、选取高精度减法C语言
C 语言中实现高精度减法需要手动实现字符串转数值和数值转字符串,相对比 c++ 更加繁琐。以下是高精度减法的 C 语言代码示例:
#include <stdio.h> #include <string.h> #define MAXN 10010 int a[MAXN], b[MAXN], c[MAXN]; // a - b = c int lena, lenb, lenc; void print() { // 输出结果 if (lenc == 0) printf("0"); for (int i = lenc - 1; i >= 0; i--) { printf("%d", c[i]); } printf("\n"); } bool cmp(int* a, int* b, int lena, int lenb) { if (lena != lenb) return lena < lenb; for (int i = lena - 1; i >= 0; i--) { if (a[i] != b[i]) return a[i] < b[i]; } return true; } void sub(int* a, int* b, int* c, int lena, int lenb) { int borrow = 0; for (int i = 0; i < lena; i++) { c[i] = a[i] - borrow - b[i]; if (c[i] < 0) { c[i] += 10; borrow = 1; } else { borrow = 0; } } while (lenc > 0 && c[lenc - 1] == 0) lenc--; } void str2int(char* str, int* x, int& len) { len = strlen(str); for (int i = 0; i < len; i++) { x[i] = str[len - 1 - i] - '0'; } } void int2str(int* x, int len, char* str) { int pos = 0; for (int i = len - 1; i >= 0; i--) { str[pos++] = x[i] + '0'; } str[pos] = '\0'; } int main() { // 读入两个大数 char sa[MAXN], sb[MAXN]; scanf("%s%s", sa, sb); str2int(sa, a, lena); str2int(sb, b, lenb); if (cmp(a, b, lena, lenb)) { memcpy(c, b, sizeof(b)); memcpy(b, a, sizeof(a)); memcpy(a, c, sizeof(c)); int tmp = lenb; lenb = lena; lena = tmp; printf("-"); } lenc = lena; sub(a, b, c, lena, lenb); int2str(c, lenc, sa); printf("%s\n", sa); return 0; }