Python入门到实战 后端面试 观察者模式 web razor service 虚拟机 layer vue传值 click事件 oracle查看数据库 bitlocker加密好慢 linux查看jdk安装路径 mysql时间戳转换日期 python类与对象 搭建java环境 java的运行环境 java时间转换 java字符串操作 corelpainter python入门经典 摩斯密码翻译 bash命令 苹果剪辑 eclipse中文版下载 识别音乐的软件 js刷新页面 说话不算数的经典语句 一键隐藏 视频后期处理软件 脚本编程 小米游戏鼠标 apihook linux安卓模拟器 js给标签添加属性 facetime要钱吗 服务器之家 动漫情侣头像一男一女 HTA 饥荒黄油
当前位置: 首页 > 学习教程  > 编程语言

高精度加减,康一个就够!

2020/11/4 14:05:37 文章标签:

高精度加减,康一个就够!1.神马是高精度?算法呢?2.怎么实现?3.诶,有坑3.1.1. 数位对齐怎么对?3.1.2 那空位呢?3.1.3 怎么倒置?3.2. 减法结果为负怎么办?3.3. 哦…

高精度加减,康一个就够!

  • 1.神马是高精度?算法呢?
  • 2.怎么实现?
  • 3.诶,有坑
      • 3.1.1. 数位对齐怎么对?
      • 3.1.2 那空位呢?
      • 3.1.3 怎么倒置?
      • 3.2. 减法结果为负怎么办?
      • 3.3. 哦,对了
  • 4.代码如下:

1.神马是高精度?算法呢?

高精度,就是利用数据结构模拟变量,来为了防止变量的局限性影响程序运行的操作。以下,我将以字符串的形式输入各数数位:

char arr[5001],brr[5001];
cin>>arr>>brr;

利用数据结构来进行系列的数学运算,如高精度加,高精度减等……

2.怎么实现?

用字符串的各位来模拟草稿的计算过程

串名 \ 下标0123
arr4321
brr1234
+运算后
arr5555
-运算后
arr3087

3.诶,有坑

3.1.1. 数位对齐怎么对?

数组下标与数字各位的对照表:

下标:012
1(百位)2(十位)3(个位)
1(十位)2(个位)

明显,数位不对齐
我们的解决方案是(bgm)——数组倒置
如下:

下标:012
3(个位)2(十位)1(百位)
2(个位)1(十位)

OK对齐了

3.1.2 那空位呢?

很久很久以前,有一张表:

串名 \ 下标0123
arr4321
brr1234
+运算后
arr5555

两者对齐了,没问题
但是——

下标:012
3(个位)2(十位)1(百位)
2(个位)1(十位)/(空着的)

这里一般用零补位,如下:

下标:012
3(个位)2(十位)1(百位)
2(个位)1(十位)0(补位)

3.1.3 怎么倒置?

一般的简单方法是倒序输出
当然我们可以如下方式完成倒序的操作:

void Inversion(char arr[],int len1) {
	for(int i=0;i<len1/2;i++) {
//对半交换
		swap(arr[i],arr[len1-i-1]);
	} 
}

3.2. 减法结果为负怎么办?

有一个操作如下:
式a - b
= - [ - ( a - b ) ]
= - [ - a + b ]
= - [ b - a ]

那么,我们这样处理:

Created with Raphaël 2.2.0 开输入两数组,获得两者的长度记录变量 确认为负? 输出负号 交换两数组的内容 交换两数组的长度记录变量 结束 yes no

3.3. 哦,对了

1. 退

2. ascii

4.代码如下:

#include <iostream>
#include <cstring>
using namespace std;
class HighPrecision{
	public:
		void _Plus(char arr[],char brr[]) {//高精加
			int len1=strlen(arr);
			int len2=strlen(brr);
			int tmp=0;//进位控制变量 

			Inversion(arr,len1); 
			Inversion(brr,len2);
//倒置数组 

			if(len1>len2)
				for(int i=len2;i<len1;i++)
					brr[i]='0';
			else
				for(int i=len1;i<len2;i++)
					arr[i]='0';
//加入前导0
 
			for(int i=0;i<max(len1,len2);i++) {
				arr[i]=arr[i]+brr[i]-48+tmp;
				if(arr[i]>'9')
					tmp=1,arr[i]-=10;
				else
					tmp=0;
			}
//计算
 
			if(tmp==1)
				arr[max(len1,len2)]='1';
//有进位就单独先输出 

			for(int i=max(len1,len2)+tmp-1;i>=0;i--)
				cout<<arr[i];
			cout<<endl;
//输出 
		}
		void _Minus(char arr[],char brr[]) {//高精减
			int len1=strlen(arr);
			int len2=strlen(brr);
			int flag=0;//正负检测标识 1为正,2为负
 
			if(len1>len2) {
				flag=1;
			}
			else if(len2>len1) {
				flag=2;
			}
			else{
				for(int i=0;i<len1;i++) {
					if(arr[i]>brr[i]) flag=1;
					if(arr[i]<brr[i]) flag=2;
				}
			}
			if(flag==0) cout<<'0';
//检测正负
 
			else{
				if(flag==2) {
					cout<<'-';
					swap(arr,brr);
					swap(len1,len2);
				}
//a-b=-(b-a)
 
				Inversion(arr,len1); 
				Inversion(brr,len2);
//倒置数组 

				if(len1>len2)
					for(int i=len2;i<len1;i++)
						brr[i]='0';
				else
					for(int i=len1;i<len2;i++)
						arr[i]='0';
//加入前导0

				for (int i=0;i<len1;i++) {
				    if (arr[i]<brr[i]) {
				        arr[i+1]--;
				        arr[i]+=10;
				    }
				    arr[i]-=brr[i]-'0';
				}
//计算

			    for (int i=len1-1;i>=0;i--) {
			        if('0'==arr[i] && len1>1) {
			        	len1--;
			        	continue;
					}
					break;
			    }
//删前导零 

			    for (int i=len1-1;i>=0;i--)
			        cout<<arr[i];
			    cout<<endl;
//输出 
			} 
		}
	private:
		void Inversion(char arr[],int len1) {
			for(int i=0;i<len1/2;i++)
				swap(arr[i],arr[len1-i-1]);
		}
};
/*小测一下
int main() {
	char arr[5001],brr[5001],Tar[5001],Tbr[5001];
	cin>>arr>>brr;
	strcpy(Tar,arr);
	strcpy(Tbr,brr);

	HighPrecision Plus,Minus;
	Plus._Plus(arr,brr);
	Minus._Minus(Tar,Tbr);
	return 0;
}
*/

本文链接: http://www.dtmao.cc/news_show_350072.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?