栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

高精度减法(C++实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

高精度减法(C++实现)

高精度减法 简介

用于计算含有超过一般变量存放不下的非负整数

高精度加法这个过程是模拟的小学竖式减法计算

注:在本文中,我们默认输入的第一个数为被减数,且被减数大于减数

原理基本上与高精度加法相同,仅在核心代码处有些区别,因此本文较为简略,建议先阅读文章《高精度加法(C++实现)》

主要步骤

清零逆置转换相减计算(包含退位) 代码实现 逆置

因为数组存放的元素顺序与我们计算的顺序是相反的,在竖式计算中我们是将其右对齐(个位对个位,十位对十位,以此类推),而读取数字后的两个数组是左对齐的,因此我们要将里面的元素逆置

//参数:需要逆置的数组,数组长度
void invertElem(char s[], size_t n)
{
	size_t len = n-1;
	for(size_t i=0,j=len;i 
转换 

为了方便计算和进位,我们需要将字符型的数字转化成实际数字

注意:这里的转换不是类型转换,例如字符类型8,我们要让它自减48,转化成ASCII码为8的对应的字符,存放元素的数组的类型并没有改变

转换必须在逆置之后。如果转换在前逆置在后,则逆置时分不清末尾的0是数字的一部分还是结束符转换后的数字

//参数:数组,长度
void charInt(char s[], size_t n)
{
	for(size_t i=0; i 
相减 
int main()
{
	while(1)
	{
		char a[1024];
		char b[1024];
		char c[2049];
		
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		
		if(scanf("%s%s",a,b)==EOF) break;
		
		size_t len_a = strlen(a);
		size_t len_b = strlen(b);
		
		size_t max_len = len_a>len_b?len_a:len_b;
		
		invertElem(a,len_a);
		invertElem(b,len_b);
		
		charInt(a,len_a);
		charInt(b,len_b);
		
		//这部分是高精度减法的核心
		int carry = 0;
		for(size_t i=0; i<=max_len; i++)
		{
			c[i] = (a[i]-carry=1&&c[i]==0; i--);
		
		for(; i>=0; i--)
			printf("%d", c[i]);
		printf("n");
		
		
	}
	
	
	
	return 0;
}
完整代码
#include 

using namespace std;

//逆置
void invertElem(char s[], size_t n)
{
	size_t len = n-1;
	for(size_t i=0,j=len;ilen_b?len_a:len_b;
		
		invertElem(a,len_a);
		invertElem(b,len_b);
		
		charInt(a,len_a);
		charInt(b,len_b);
		
		//这部分是高精度减法的核心
		int carry = 0;
		for(size_t i=0; i<=max_len; i++)
		{
			c[i] = (a[i]-carry=1&&c[i]==0; i--);
		
		for(; i>=0; i--)
			printf("%d", c[i]);
		printf("n");
		
		
	}
	
	
	
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/718058.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号