加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数加减乘除

发布时间:2020-12-14 02:46:40 所属栏目:大数据 来源:网络整理
导读:/* 模板 大数乘小数 */#include stdio.h#include string.h#define N 1000char* 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 --){/
/* 模板 大数乘小数 
*/

#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] = '';
	
	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("%sn",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] = {""};					// 保存结果 
	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] = '';
	
	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",&b) != EOF){
		printf("%sn",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]= {""};			// 保存运算结果 
	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",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] = '';
	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 
		ni ++;
	}
	
	if(ok){
		ans[ni --] = '-';
	}
	
	return ans + ni + 1; 
}

int main()
{
	char a[N],b));
	}
	
	return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读