高精度(加减乘除)

这篇具有很好参考价值的文章主要介绍了高精度(加减乘除)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

高精度(加减乘除)

高精度的核心思想就是利用数组去储存大数,然后通过模拟手动计算的方式,来进行计算。

主要分三个模块:

1.读入数据并转换为(int)类型储存

高精度加法

核心思想:将每个位上的数字都+起来,如果大于10就进位。

核心代码如下:

c[i]+=a[i]+b[i];//两数相加
c[i+1]+=c[i]/10;//进位
c[i] = c[i]%10;//保留

完整代码及解析如下:

string x, y;//两个string类用来接收大数
//a接收x中的每一位数字,b用来接收y中的每一位数组,计算之后,储存到c数组中
int a[999], b[999], c[999];
int main()
{
	cin >> x >> y;//读入
	//将大数的每一位数转换为(int)类型,然后倒序储存
	for (int i = 0; i < x.length(); i++)
	{
		a[i] = x[x.length() - 1 - i]-'0';
	}
	for (int i = 0; i < y.length(); i++)
	{
		b[i] = y[y.length() - 1 - i]-'0';
	}
    
    //核心:开始计算
    //位数问题:两个数相加,和的位数等于max(x.length(), y.length(),或者是其+1;
	for (int i = 0; i < max(x.length(), y.length()); i++)
	{
		c[i] += a[i] + b[i];//对应位数求和
		c[i + 1] += c[i] / 10;//进位
		c[i] = c[i] % 10;//保留
	}
    
    //下面开始消除前导0
	int k = 0;//利用k来修正位数
	if (c[max(x.length(), y.length())] == 0)//如果最高位==0
	{
		k = 1;//k++输出位数-1
	}
    //注意看k是如何控制位数的
	for (int i = max(x.length(), y.length())-k; i >=0 ; i--)
	{
		cout << c[i];
	}
	cout << endl;

    //完美落幕
	return 0;
}

高精度减法

减法核心:只使用大数减小数,如果某一位小于0,就向前一位借1

核心代码如下:

c[i]+=a[i]-b[i];//两数相减,储存到c
if(c[i]<0)//如果小于0
{
    //借1
	c[i+1]--;
	c[i]+=10;
}

完整代码及解析如下:

string x, y;//x和y用来接收大数
//a,b用来储存大数的每一位数
int a[20000], b[20000], c[20000];
bool cmp(string x, string y)//比较x,y
{
    //先比较位数,位数长的一定是较大数
	if (x.size() != y.size())
	{
		return x.size() > y.size();
	}
	else//如果位数相同就从高到低比较每一位
	{
		for (int i = 0; i < x.size(); i++)
		{
            //如果某一位数字不相同就退出函数
			if (x[i] > y[i])
			{
				return true;
			}
			else if(x[i]<y[i])
			{
				return false;
			}
		}
        //如果一直相等就返回true
		return true;
        //注意返回值不能用return 0/1来写
        //必须用return true/false
	}
}
int main()
{
	cin >> x >> y;
    //因为x-y有负数存在,所以我们只用大数减小数,最后补全-号就行
    //下面进行比较:如果y比x大,就交换位置,并输出-号
	if (cmp(x, y) == false)//详见上方的cmp函数
	{
		swap(x, y);
		cout << "-";
	}
    //转换为Int类型并倒序储存
	for (int i = 0; i < x.length(); i++)
	{
		a[i] = x[x.length() - 1 - i]-'0';
	} 
	for (int i = 0; i < y.length(); i++)
	{
		b[i] = y[y.length() - 1 - i]-'0';
	}
    //核心代码
    //位数问题:两个数相减,差的位数最多是max(x.length(), y.length()
	for (int i = 0; i < max(x.length(), y.length()); i++)
	{
		c[i] += a[i] - b[i];
		if (c[i] < 0)//借1
		{
			c[i + 1] -= 1;
			c[i] += 10;
 		}	
	}
	int k = 0;
    //除0
	for (int i = max(x.length(), y.length()); i > 0; i--)
	{
		if (c[i] == 0)
		{
			k++;
		}
		else
		{
			break;
		}
	}
	for (int i = max(x.length(), y.length())-k; i >= 0; i--)
	{
		cout << c[i];
	}
	cout << endl;

	return 0;
}

高精度乘法

核心思想:利用两数相乘的特点确定c的位置,之后同加法

位数问题:两个数相乘,积的位数最多是两个数的位数之和

核心代码如下:

for (int i = 1; i <=x.length(); i++)
{
	for (int j = 1; j <= y.length(); j++)
	{
		c[i + j - 1]+= a[i] * b[j];//c的下标等于a,b的下标之和-1
		c[i + j] += c[i + j - 1] //10;进位
		c[i + j - 1] %= 10;//保留
	}
}

完整代码及解析如下:

string x, y;
int a[99999], b[99999], c[99999];
int main()
{
	cin >> x >> y;
	for (int i = 0; i < x.length(); i++)
	{
		a[i+1] = x[x.length() - 1 - i]-'0';
	}
	for (int i = 0; i < y.length(); i++)
	{
		b[i+1] = y[y.length() - 1 - i]-'0';
	}
	//核心代码
	for (int i = 1; i <=x.length(); i++)
	{
		for (int j = 1; j <= y.length(); j++)
		{
			c[i + j - 1]+= a[i] * b[j];
			c[i + j] += c[i + j - 1] / 10;
			c[i + j - 1] %= 10;
		}
	}
	//除0
	int k = 0;
	for (int i = x.length()+ y.length(); i >=2; i--)
	{
		if (c[i] == 0)
		{
			k++;
		}
		else
		{
			break;
		}
	}
	for (int i = x.length()+ y.length()-k; i >=1 ; i--)
	{
		cout << c[i];
	}
	cout << endl;

	return 0;
}

高精度除法(高精度除以低精度)

核心思想:利用手动除法的特点,将除法转化为减法,再进行计算

核心代码如下:

for (int i = 0; i < s.size(); i++)
{
	c[i] += (x * 10 + a[i]) / b;//将每次除法之后的余数+a[i]之后再去除除数
	x = (x * 10 + a[i]) % b;//x为每次除法之后的余数
}

完整代码及解析如下文章来源地址https://www.toymoban.com/news/detail-710973.html

string s;
long long b;
long long a[99999], c[99999],x;
int main()
{
	cin >> s >> b;
    //注意除法时是正序输入
	for (int i = 0;i<s.size();i++)
	{
		a[i] = s[i] - '0';
	}
    //核心代码
	for (int i = 0; i < s.size(); i++)
	{
		c[i] += (x * 10 + a[i]) / b;
		x = (x * 10 + a[i]) % b;
	}
	//除0
	int k = 0;
	for (int i = 0; i < s.size()-1; i++)
	{
		if (c[i] == 0)
		{
			k++;
		}
		else
		{
			break;
		}
	}
	for (int i = k; i < s.size(); i++)
	{
		cout << c[i];
	}
	cout << endl;
	return 0;
}

到了这里,关于高精度(加减乘除)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • bigdecimal加减乘除运算

    打印的结果如下: 打印结果如下: 打印结果如下:

    2024年02月11日
    浏览(47)
  • 不用加减乘除做加法

    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号,本题OJ链接 数据范围:两个数都满足 −10≤n≤1000 进阶:空间复杂度 O(1),时间复杂度 O(1) 分析 :本题要求不能使用+、-、*、/,所以我们应该从二进制的角度去考虑,因为二进制的加法可以通

    2024年02月10日
    浏览(40)
  • C语言加减乘除运算

    加减乘除是常见的数学运算,C语言当然支持,不过,C语言中的运算符号与数学中的略有不同,请见下表。 加法 减法 乘法 除法 求余数(取余) 数学 + - × ÷ 无 C语言 + - * / % C语言中的加号、减号与数学中的一样,乘号、除号不同;另外C语言还多了一个求余数的运算符,就是

    2024年02月06日
    浏览(43)
  • 图像四则运算(加减乘除)

    实验目的: 1.了解图像的算术运算在数字图像处理中的初步应用。 2.体会图像算术运算处理的过程和处理前后图像的变化。 3.能够实现简单的图像处理 实验原理: 图像的代数运算包括加,减,乘,除,这些运算的主要对象是图像数据块中的数据。这四种代数运算可以由如

    2024年02月08日
    浏览(52)
  • 只使用位运算实现加减乘除

    在线OJ: LeetCode 29. 两数相除 原题目的要求是不能使用乘法, 除法和取余运算符实现除法. 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘除实现了. 首先我们需要知道两数之和可以是两个数位相加和不进位相加之和, 而两数进

    2024年02月06日
    浏览(49)
  • Rust 复数运算,重载加减乘除运算

    复数定义 由实数部分和虚数部分所组成的数,形如a+bi 。 其中a、b为实数,i 为“虚数单位”,i² = -1,即虚数单位的平方等于-1。 a、b分别叫做复数a+bi的实部和虚部。 当b=0时,a+bi=a 为实数; 当b≠0时,a+bi 又称虚数; 当b≠0、a=0时,bi 称为纯虚数。 实数和虚数都是复

    2024年02月13日
    浏览(38)
  • Pytorch入门:Tensor加减乘除矩阵运算

    若张量维数大于2,则对最后两维进行matmul。进行此运算的要求是张量a与b除最后两维外的其他维必须一致:

    2024年02月12日
    浏览(46)
  • Python Opencv实践 - 图像的加减乘除

               

    2024年02月13日
    浏览(39)
  • Java进行数字计算 BigDecimal计算(加减乘除)

    Double只能处理16位有效数精度,在某些情况下精度对其需求是不够的,所以就有了BigDecimal。因为BigDecimal的精度范围的范围大,所以在问我们的开发业务中对精度要求高的属性,就需要BigDecimal来进行存储计算,防止精度丢失。这里我主要介绍一下BigDecimal的加,减,乘,除。四

    2023年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包