首页 > 其他分享 >高精度(加减乘除)

高精度(加减乘除)

时间:2023-10-22 16:44:53浏览次数:42  
标签:string 高精度 int ++ length 位数 加减乘除

高精度(加减乘除)

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

主要分三个模块:

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为每次除法之后的余数
}

完整代码及解析如下

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;
}

标签:string,高精度,int,++,length,位数,加减乘除
From: https://www.cnblogs.com/csclixuan/p/17780641.html

相关文章

  • 高精度加减乘除
    大整数的高精度运算加法#include<bits/stdc++.h>usingnamespacestd;vector<int>big_num_add(vector<int>n1,vector<int>n2){vector<int>ans;intt=0;for(inti=0;i<n1.size()||i<n2.size();i++){if(i&l......
  • 请完善课上的口算题卡代码,实现重复题目的检测、题目数字范围、加减乘除算式的参数化等
    importjava.util.HashSet;importjava.util.Random;importjava.util.Set;publicclassMathQuizGenerator{  publicstaticvoidmain(String[]args){    intnumberOfQuestions=10;//设定生成题目的数量    intminNumber=1;//题目数字的最小值 ......
  • JS 数字类型的加减乘除, 四舍五入保持精度
    Number.prototype.toFixed=function(d=0){ letchangeNum=this+''//把数字转为字符串 if(changeNum.indexOf('-')!=-1){//判断是否是负数 changeNum=Math.abs(Number(changeNum))} changeNum=(Math.round(Number(changeNum)*Math.......
  • 高精度除法
    一、算法描述高精度除法和乘法讨论的一样,都是一个大整数和一个小整数之间的运算。算法思路根据小学除法一样,我们还是模拟这个过程。注意这里遍历\(A\)数组的时候要按照我们读数字的顺序,也就是从数组尾部到头部遍历。每一位的计算过程应该是,上一轮的余数\(r\)乘\(10\)之......
  • RTK高精度定位安全帽-UWB室内定位/GPS定位智能安全帽技术方案
    高精度RTK定位安全帽是一种综合性解决方案,结合了先进的GPS定位技术、物联网技术、移动数据传输和智能执法管理。相较于传统的定位安全帽,它提供了更高的定位精度、更强大的数据处理能力和更全面的施工过程记录,对公共安全领域有着实质性的积极影响。该安全帽采用厘米级RTK定......
  • 高精度乘法
    一、算法描述高精度加减法讨论的是两个大整数之间的运算。而这里高精度乘除法讨论的是一个大整数和一个小整数之间的关系。算法思路:还是模拟小学的乘法列竖式,只不过此时不太一样,原本的列竖式是一位一位的乘,这里需要改变一下思路。这里直接把小整数当成一个数,所乘的数直接......
  • 高精度算法
    1.高精度加法这个比较简单一些,主要是考虑满10进位的问题,直接写代码就可以。(若数字很大的话,不太好运算,所以将数字转化成字符串的形式输入)#include<iostream>usingnamespacestd;constintN=100010;intA[N],B[N],C[N];intAdd(inta[],intb[],intc[],intcnt)......
  • 高精度减法
    一、算法描述要实现两个高精度数的减法,和高精度加法一样都是模拟竖式计算的过程,主要就是解决以下两个问题。谁大谁小?由于这两个数字都很大,但是不知道谁更大,所以要先判断哪个数更大,思路如下:判断这两个数谁的位数更大,位数更大的自然更大。如果位数不相同,从最高位开始往低位......
  • 高精度
    用处当我们做一些(SB)题时,会发现答案有可能会爆longlong,那么这时候就要用高精度了实现高精度其实就是用一个数组存数位来表示这个数,然后模拟加,减,乘的过程来算出答案高精度板子(加法)for(inti=10000;i>=1;i--){c[i]+=(a[i]+b[i])%10;c[i+1]+=(a[i]+b......
  • 高精度加法
    一、算法描述高精度问题是指两个数字非常大,超过了int,甚至longlong的范围,数字的位数甚至能达到\(10^5\),那么如果要实现这样两个大数字的运算,需要解决以下两个问题:如何存储?这样的两个数字相加是不可能用普通类型来存储的,所以我们第一个要解决的问题就是如何存储高精度数。首......