C++高精度运算(加减乘除)
创始人
2024-05-13 00:34:27
0

C++中在int 是32位bit是2^32-1。

C/C++基础数字类型的取值范围
类型    取值范围    位数
unsigned   int    0~4294967295    10位
int    2147483648~2147483647    10位
unsigned long    0~4294967295    10位
long    2147483648~2147483647    10位
long long    -9223372036854775808~9223372036854775807    19位
unsigned long long    0~1844674407370955161    19位
__int64    -9223372036854775808~9223372036854775807    19位
unsigned __int64    0~18446744073709551615    20位

用高精度可以计算的更大。

下面是加法运算:

#define _CRT_SECURE_NO_WARNINGS 1	
#include
#include
#include
using namespace std;
const int N = 100005;
int A[N], B[N], C[N];
int la, lb, lc;
void add(int A[], int B[], int C[]) {for (int i = 0; i < lc; i++) {C[i] += A[i] + B[i]; //累加C[i + 1] += C[i] / 10; // 进位C[i] %= 10; //存余数}if (C[lc]) lc++; // 注意最高位的处理 lc是位长
}
int main() {string a, b;cin >> a >> b;la = a.size(), lb = b.size(), lc = max(la, lb); // 这里是取最高位for (int i = la - 1; ~i; i--) A[la - 1 - i] = a[i] - '0';for (int i = lb - 1; ~i; i--) B[lb - 1 - i] = b[i] - '0';add(A, B, C);for (int i = lc - 1; ~i; i--) printf("%d", C[i]);return 0;
}

减法运算:

注意要用大数减小数,如果是小数减大数要加负号.在减的时候要用while确定不为0的位。

在主函数中要注意for不需要减一。

#define _CRT_SECURE_NO_WARNINGS 1	
#include
#include
#include
using namespace std;
const int N = 100005;
int A[N], B[N], C[N];
int la, lb, lc;
bool cmp(int A[], int B[]) {if (la != lb) return la > lb;for (int i = la - 1; ~i; i--) {if (A[i] != B[i]) return A[i] > B[i];}return true;
}
void sub(int A[], int B[], int C[]) {for (int i = 0; i < lc; i++) {if (A[i] < B[i]) {A[i + 1]--, A[i] += 10;}C[i] = A[i] - B[i];}while (lc && C[lc] == 0) lc--;
}
int main() {string a, b;cin >> a >> b;la = a.size(), lb = b.size(), lc = max(la, lb); // 这里是取最高位for (int i = la - 1; ~i; i--) A[la - 1 - i] = a[i] - '0';for (int i = lb - 1; ~i; i--) B[lb - 1 - i] = b[i] - '0';if (!cmp(A, B)) swap(A, B), cout << "-";sub(A, B, C);for (int i = lc ; ~i; i--) printf("%d", C[i]);return 0;
}

乘法运算:

#define _CRT_SECURE_NO_WARNINGS 1	
#include
#include
#include
using namespace std;
const int N = 100005;
int A[N], B[N], C[N];
int la, lb, lc;
void mul(int A[], int B[], int C[]) {for (int i = 0; i < la; i++) {for (int j = 0; j < lb; j++) {C[i + j] += A[i] * B[j]; // 这里要注意是加C[i + j + 1] += C[i + j] / 10;C[i + j] = C[i + j] % 10;}}while (lc && C[lc] == 0) lc--;
}
int main() {string a, b;cin >> a >> b;la = a.size(), lb = b.size(), lc = la+lb; // 这里是取最高位for (int i = la - 1; ~i; i--) A[la - 1 - i] = a[i] - '0';for (int i = lb - 1; ~i; i--) B[lb - 1 - i] = b[i] - '0';mul(A, B, C);for (int i = lc; ~i; i--)printf("%d", C[i]);return 0;
}

除法运算:

#define _CRT_SECURE_NO_WARNINGS 1	
#include
#include
#include
using namespace std;
const int N = 100005;
int A[N], B[N], C[N];
int la, lb, lc;
void mul(int A[], int B[], int C[]) {for (int i = 0; i < la; i++) {for (int j = 0; j < lb; j++) {C[i + j] += A[i] * B[j]; // 这里要注意是加C[i + j + 1] += C[i + j] / 10;C[i + j] = C[i + j] % 10;}}while (lc && C[lc] == 0) lc--;
}void div(int A[], int b, int C[]) {long long r = 0;for (int i = la - 1; ~i; i--) {r = r * 10 + A[i];C[la - 1 - i] = r / b; //从后向前r %= b;}reverse(C, C + lc);while (lc && C[lc] == 0) lc--;
}int main() {string a;int b;cin >> a >> b;la = a.size(),  lc = la; // 这里是取最高位for (int i = la - 1; ~i; i--) A[la - 1 - i] = a[i] - '0';//for (int i = lb - 1; ~i; i--) B[lb - 1 - i] = b[i] - '0';//mul(A, B, C);div(A, b, C);for (int i = lc; ~i; i--)printf("%d", C[i]);return 0;
}

相关内容

热门资讯

激发暑期文旅消费新动能   内蒙古阿尔山,漫步国家森林公园,感受清凉夏日;甘肃敦煌,坐在鸣沙山上,听一场星空演唱会;江苏连云...
日股收跌0.19% 格隆汇7月11日|日经225指数收盘下跌76.68点,跌幅0.19%,报39569.68点。
遵义小伙跳水救人牺牲,年仅31... (转自:遵义晚报)7月8日下午6时,遵义市播州区出现感人一幕——尚嵇镇大坝社区全军坝组28岁的村民陈...
“小记者”走进河北省邯郸市食品... 中国质量新闻网讯 7月7日下午,河北省邯郸市食品药品检验中心(市食品药品安全科普基地)联合邯郸新闻传...
局地超42℃!下周河南持续高温... 大范围高温闷热天气强势来袭!12日起,西太平洋副热带高压将再次控制我省,受其影响,13日至20日我省...
毕市监处罚[2025]1021... 毕市监处罚[2025]1021号浏览:1次基本信息:处罚机关毕节市市场监督管理局处罚日期2025年0...
达势股份-达美乐中国以4D战略...   达势股份-达美乐中国("达美乐中国"或"达势股份"或"公司")(1405.HK)是达美乐比萨在中...
“向上取整”:变相“明抢” 转自:中国质量报□ 胡立彪近日,有媒体对快递行业称重计费问题进行测评,结果发现,被测评的8家快递企业...
以改革破局 盐城经开区多点突破... 中新网江苏新闻7月11日电(倪玲)改革是发展的根本动力,开放是进步的必由之路。近年来,盐城经开区将推...
中国代表强调国际刑事法院应依法... 转自:千龙网新华社联合国7月10日电 中国常驻联合国副代表孙磊10日在安理会审议国际刑事法院涉苏丹问...