2月6日自习总结

今天学了大数运算,就是模拟竖式运算,用字符数组及整型数组存储和运算

目录

大数:

 大数加法:

大数减法:

大数乘法:

 总代码及演示:


大数:

概念:

在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]);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值