今天学了大数运算,就是模拟竖式运算,用字符数组及整型数组存储和运算
目录
大数:
概念:
在int(-2^31 —2^31-1)或者long long( -2^62 — 2^62-1)之内,但在有些特殊情况下,我们会遇到超过这个范围的数据,这些数据就称为题目中提到的大数。
大数加法:
void big_sum(char *a, char *b, int *c, int *lenc) { //a,b分别为要加上的数,c为返回数组,lenc为返回长度
int aa[100] = {0}, bb[100] = {0};
int lena = strlen(a), lenb = strlen(b);
for (int i = lena - 1, k = 0; i >= 0; i--, k++) {
aa[k] = a[i] - '0';
}
for (int i = lenb - 1, k = 0; i >= 0; i--, k++) {
bb[k] = b[i] - '0';
}
int tt = 0, i;
for (i = 0; i < max(lena, lenb); i++) {
c[i] = (aa[i] + bb[i] + tt) % 10; //相同位数上两数及进位相加
tt = (aa[i] + bb[i] + tt) / 10; //逢时进1
}
i--;
if (c[i] >= 10) { //判断最高位是否大于10
c[i + 1] = c[i] / 10;
c[i] = c[i] % 10;
i++;
}
*lenc = i;
}
大数减法:
void big_sub(char *a, char *b, int *c, int *lenc) { //a-b(a必须大于b)
int aa[100] = {0}, bb[100] = {0};
int lena = strlen(a), lenb = strlen(b);
for (int i = lena - 1, k = 0; i >= 0; i--, k++) {
aa[k] = a[i] - '0';
}
for (int i = lenb - 1, k = 0; i >= 0; i--, k++) {
bb[k] = b[i] - '0';
}
int i;
for (i = 0; i < max(lena, lenb); i++) {
if (aa[i] - bb[i] > 0) {
c[i] = aa[i] - bb[i];
} else {
a[i + 1]--; //借位
c[i] = 10 + aa[i] - bb[i];
}
}
c[i] = aa[i] - bb[i];
i--;
*lenc = i;
}
大数乘法:
void big_multi(char *a, char *b, int *c, int *lenc) {
int aa[100] = {0}, bb[100] = {0};
int lena = strlen(a), lenb = strlen(b);
for (int i = lena - 1, k = 0; i >= 0; i--, k++) {
aa[k] = a[i] - '0';
}
for (int i = lenb - 1, k = 0; i >= 0; i--, k++) {
bb[k] = b[i] - '0';
}
for (int i = 0; i < lena; i++) {
for (int k = 0; k < lenb; k++) {
c[i + k] += aa[i] * bb[k];//先乘起来,后面再进行进位
}
}
for (int i = 0; i < 2 * max(lena, lenb); i++) {//进位
if (c[i] >= 10) {
c[i + 1] += c[i] / 10; //将十位上进位
c[i] %= 10; //将各位上的数字留下
}
}
for (int i = 2 * max(lena, lenb); i > 0; i--) {
if (c[i] == 0) {
continue;
} else {
*lenc = i;
break;
}
}
}
总代码及演示:
#include<iostream>
#include<string.h>
using namespace std;
void big_sum(char *a, char *b, int *c, int *lenc) { //a,b分别为要加上的数,c为返回数组,lenc为返回长度
int aa[100] = {0}, bb[100] = {0};
int lena = strlen(a), lenb = strlen(b);
for (int i = lena - 1, k = 0; i >= 0; i--, k++) {
aa[k] = a[i] - '0';
}
for (int i = lenb - 1, k = 0; i >= 0; i--, k++) {
bb[k] = b[i] - '0';
}
int tt = 0, i;
for (i = 0; i < max(lena, lenb); i++) {
c[i] = (aa[i] + bb[i] + tt) % 10; //相同位数上两数及进位相加
tt = (aa[i] + bb[i] + tt) / 10; //逢时进1
}
i--;
if (c[i] >= 10) { //判断最高位是否大于10
c[i + 1] = c[i] / 10;
c[i] = c[i] % 10;
i++;
}
*lenc = i;
}
void big_sub(char *a, char *b, int *c, int *lenc) { //a-b(a必须大于b)
int aa[100] = {0}, bb[100] = {0};
int lena = strlen(a), lenb = strlen(b);
for (int i = lena - 1, k = 0; i >= 0; i--, k++) {
aa[k] = a[i] - '0';
}
for (int i = lenb - 1, k = 0; i >= 0; i--, k++) {
bb[k] = b[i] - '0';
}
int i;
for (i = 0; i < max(lena, lenb); i++) {
if (aa[i] - bb[i] > 0) {
c[i] = aa[i] - bb[i];
} else {
a[i + 1]--; //借位
c[i] = 10 + aa[i] - bb[i];
}
}
c[i] = aa[i] - bb[i];
i--;
*lenc = i;
}
void big_multi(char *a, char *b, int *c, int *lenc) {
int aa[100] = {0}, bb[100] = {0};
int lena = strlen(a), lenb = strlen(b);
for (int i = lena - 1, k = 0; i >= 0; i--, k++) {
aa[k] = a[i] - '0';
}
for (int i = lenb - 1, k = 0; i >= 0; i--, k++) {
bb[k] = b[i] - '0';
}
for (int i = 0; i < lena; i++) {
for (int k = 0; k < lenb; k++) {
c[i + k] += aa[i] * bb[k];//先乘起来,后面再进行进位
}
}
for (int i = 0; i < 2 * max(lena, lenb); i++) {//进位
if (c[i] >= 10) {
c[i + 1] += c[i] / 10; //将十位上进位
c[i] %= 10; //将各位上的数字留下
}
}
for (int i = 2 * max(lena, lenb); i > 0; i--) {
if (c[i] == 0) {
continue;
} else {
*lenc = i;
break;
}
}
}
int main() {
int lenc, c[200] = {0};
char a[90], b[90];
scanf("%s %s", &a, &b);
big_sum(a, b, c, &lenc);
printf("加:");
for (int i = lenc; i >= 0; i--) {
printf("%d", c[i]);
}
printf("\n");
big_sub(a, b, c, &lenc);
printf("减:");
for (int i = lenc; i >= 0; i--) {
printf("%d", c[i]);
}
printf("\n");
big_multi(a, b, c, &lenc);
printf("乘:");
for (int i = lenc; i >= 0; i--) {
printf("%d", c[i]);
}
}