大数加减乘除

本文详细介绍了大数乘法、大数加法、大数减法等算法实现,包括大数与小数相乘和大数相加的操作,提供了解决大数运算问题的实用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* 模板 大数乘小数 
*/

#include <stdio.h>
#include <string.h>
#define N 1000

char* Mul(char a[], char b[]){
	int lena = strlen(a);
	int lenb = strlen(b);
	char ans[N];
	int ni, jw = 0, start = 0;
	memset(ans, '0', sizeof(ans));
	for(int i = lena - 1; i >= 0; i --){			// 完全仿照平时数学乘法笔算方法 
		ni = start ++;
		// start 为这轮计算保存结果的起始位置;如 123*43 第一轮算123 *3,起始位置为0,第二轮算123*4(其实*40),起始位置为1 
		// 易知,start 每轮运算后应加1 
		for(int j = lenb - 1; j >= 0; j --){
			jw = jw + (a[i] - '0') * (b[j] - '0') + ans[ni] - '0';		// jw暂存结果 
			ans[ni ++] = jw % 10 + '0';									// jw % 10 后写入ans数组 
			jw /= 10;													// jw / 10 后才是真正的进位 
		}
		while(jw){			// 本轮计算完成后,还有进位,将其写入ans数组 
			ans[ni ++] = jw % 10 + '0';
			jw /= 10;
		}
	}
	ans[ni] = '\0';
	
	for(int i = 0; i < ni / 2; i ++){		// 因为是逆序写入的,最后要反转 
		char temp = ans[i];
		ans[i] = ans[ni - i - 1];
		ans[ni - i - 1] = temp;
	}
	
	return ans;
}

int main()
{
	char a[N], b[N];
	while(scanf(" %s %s", a, b) != EOF){
		printf("%s\n", Mul(a, b));
	}
	
	return 0;
}
/* 模板 大数乘小数 
*/

#include <stdio.h>
#include <string.h>
#define N 1000

char* Mul(char a[], int b){					// 直接拿大数的每一位去乘小数,注意进位即可 
	int lena = strlen(a);
	char ans[N] = {"\0"};					// 保存结果 
	int ni = 0, jw = 0;						// ni为结果数组下表, jw保存进位 
	for(int i = lena - 1; i >= 0; i --){	// 拿大数的每一位去成小数然后加上低位进位,结果%10后保存在ans数组,结果/10 作为进位 
		jw = jw + (a[i] - '0') * b;
		ans[ni ++] = jw % 10 + '0';
		jw /= 10;
	}
	while(jw){								// jw不为0,仍要取余保存 
		ans[ni ++] = jw % 10 + '0';
		jw /= 10;
	}
	ans[ni] = '\0';
	
	for(int i = 0; i <= ni / 2; i ++){		// 结果数组倒置 
		char temp = ans[i];
		ans[i] = ans[ni - i - 1];
		ans[ni - i- 1] = temp;
	}
	
	return ans;
}

int main()
{
	int b;
	char a[N];
	while(scanf(" %s %d", a, &b) != EOF){
		printf("%s\n", Mul(a, b));
	}
	
	return 0;
}

/* 模板 大数加大数
*/

#include <stdio.h>
#include <string.h>
#define N 1000

char* Add(char a[], char b[]){		// 完全模拟数学运算习惯 
	int lena = strlen(a);
	int lenb = strlen(b);
	char ans[N]= {"\0"};			// 保存运算结果 
	int i = 0, jw = 0;				// i为ans数组下标,jw 即保存低位运算后的进位 
	while(lena -- && lenb --){		// 从最低位开始 相加 
		jw = jw + a[lena] + b[lenb] - '0' * 2;
		ans[i ++] = jw % 10 + '0';
		jw /= 10;
	}
	while(lena >= 0){				// 将单独剩余高位加上 
		jw = jw + a[lena --] - '0';
		ans[i ++] = jw % 10 + '0';
		jw /= 10;
	}
	while(lenb >= 0){
		jw = jw + b[lenb --] - '0';
		ans[i ++] = jw % 10 + '0';
		jw /= 10;
	}
	while(jw){						// 进位不为0的话,加上进位 
		ans[i ++] = jw % 10 + '0';
		jw /= 10;
	}
	
	for(int j = 0; j <= i / 2; j ++){		// 结果数组倒置 
		char temp = ans[j];
		ans[j] = ans[i - j - 1];
		ans[i - j - 1] = temp;
	}
	
	return ans;
}

int main()
{
	char a[N], b[N];
	while(scanf("%s %s", a, b) != EOF){
		printf("%s\n", Add(a, b));
	}
	
	return 0;
}
/* 模板 — 大数减大数
*/

#include <stdio.h>
#include <string.h>
#define N 1000

char* Mul(char a[], char b[]){
	char ans[N];
	int lena = strlen(a);
	int lenb = strlen(b);
	int ni = N - 2, ok = 0;				// ni为ans数组下标,计算结果倒叙存入 
	
	ans[ni + 1] = '\0';
	if(lena < lenb || lena == lenb && strcmp(a, b) < 0){				// 判断结果是不是负数 
		ok = -1;
		char ls[N];
		int temp = lena;				// 交换变量 
		lena = lenb;
		lenb = temp;
		strcpy(ls, a);
		strcpy(a, b);
		strcpy(b, ls);
	}
	
	int i, j, ls, jw = 0;				// jw 保存借位 
	for(i = lena - 1, j = lenb - 1; i >= 0 && j >= 0; i --, j --){		// 从最低位开始相减 
		ls = a[i] - b[j] - jw;			// ls 临时保存结果 
		if(ls < 0){
			ls += 10;					// 借位 
			jw = 1;
		}
		else{
			jw = 0;
		}
		ans[ni --] = ls + '0';
	}
	while(i >= 0){
		ls = a[i --] - '0'  - jw;
		if(ls < 0){
			ls += 10;					// 借位 
			jw = 1;
		}
		else{
			jw = 0;
		}
		ans[ni --] = ls + '0';
	}
		
	while(ans[ni + 1] == '0' && ans[ni + 2] != '\0'){			// 除去前导0 
		ni ++;
	}
	
	if(ok){
		ans[ni --] = '-';
	}
	
	return ans + ni + 1; 
}

int main()
{
	char a[N], b[N];
	while(scanf(" %s %s", a, b) != EOF){
		printf("%s\n", Mul(a, b));
	}
	
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值