IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 高精度c++ -> 正文阅读

[C++知识库]高精度c++

高精度加法
什么是高精度加法了?也就是说,当两个数过大的时候,用基本数据类型,无法进行操作时,我们可以这样做,用两个字符数组,s1,s2,进行输入,存储用于加法的两个数,又定义三个数组,a,b,c进行,运算,因为,我们在进行加法运算时,是从低位到高位进行逐位相加,进位操作,所以最初输入的s1,s2字符数组,不仅要进行转换为数组,还要逆序存储在,整型数组a,b中,我们可以知道,两个数相加的话,那么它的和的位数最多,比这两个数中的最大的位数多一位,于是,我们可以得到和的位数,用来作为for循环的上界,然后是搞进度的核心部分,这里需要注意的是,进位,那么如何进位了,我们知道当i=1时,c[i]+=a[i]+b[i],至于为什么要加等于了,哈哈,我们可以先看下一位,i=2时,假设,前面有进位,那么,如果是直接赋值的话,我们就得不到,进位的值了,所以需要进行加等于,然后是整除得到进位值,以及,当a[i]+b[i]大于十时,取余得到余下的值,最后,再进行删除前导零,因为最后的相加,可能进位,也可能不进位,这时多出来的一位如果不删除的话,逆序输出时,会存在前导零。

#include <bits/stdc++.h>
using namespace std;
int a[505],b[505],c[505];
char s1[505],s2[505];
int main()
{
	int la,lb,lc;
	scanf("%s",s1);
	scanf("%s",s2);
	la=strlen(s1);
	lb=strlen(s2);
	for(int i=0;i<la;i++)
		a[la-i]=s1[i]-'0'; //将字符转换为数字,并进行转置
	for(int i=0;i<lb;i++)
		b[lb-i]=s2[i]-'0';
	lc=max(la,lb)+1;  //确保空间足够 
	for(int i=1;i<=lc;i++)
	{
		c[i]+=a[i]+b[i];
		c[i+1]+=c[i]/10; //进位
		c[i]=c[i]%10;  //留下个位 
	} 
	//删除前导零
	if(c[lc]==0 && lc>0) lc--;
	for(int i=lc;i>0;i--) 
		printf("%d",c[i]);
	return 0;
} 

高精度减法
下面是高精度减法,这里依然是借助数组进行运算,和高精度加法不同的是,这里需要进行定义一个函数进行比较减数与被减数之间的大小,当被减数小于减数时要进行交换两者,并标记为1,标记为1,也就是说最终结果需要输出一个负号,这里有很多和高精度加法相似的地方,我就不说了,来讲一讲高精度减法的核心,也就是,进行借位,依次遍历每一个数当a[i]<b[i]时,这时,需要借位,那么a[i+1]就需要减1,对于a[i]来说相当与加10;
最后得到结果,消去前导零输出,注意和加法不同的是这里用的是while,因为,减法的前导零可能不只有一个。

#include <bits/stdc++.h>
using namespace std;
char s1[10090],s2[10090],s3[10090];
int a[10090],b[10090],c[10090];
int flag=0;
bool compare(char s1[],char s2[])
{
	//如果s1>=s2,返回true,否则返回false 
	int u=strlen(s1),v=strlen(s2);
	if(u!=v) return u>v;
	//
	for (int i=0;i<u;i++)
	{
		if(s1[i]!=s2[i])
			return s1[i]>s2[i];
	}
	return true;
}
int main()
{
	int la,lb,lc;
	cin>>s1>>s2;
	if(!compare(s1,s2))  //如果s1<s2,就交换两个数 
	{
		flag=1; //标记为负号,因为是一个小的数减去一个大的数。
		//进行交换
		strcpy(s3,s1); //所以说s3不过是一个中间变量。 
		strcpy(s1,s2);
		strcpy(s2,s3); 
	}
	la=strlen(s1);
	lb=strlen(s2); 
	//然后需要将字符数组,逆序赋值给a,b;
	for(int i=0;i<la;i++)
	{
		a[la-i]=s1[i]-'0';
	}
	for(int i=0;i<lb;i++)
	{
		b[lb-i]=s2[i]-'0';
	} 
	//高精度减法的核心
	lc=max(la,lb);
	for(int i=1;i<=lc;i++)
	{
		if(a[i]<b[i]) //就需要借位
		{
			a[i+1]--;
			a[i]+=10;
		 } 
		 c[i]=a[i]-b[i];
	 } 
	 //消去前导零
	 while(c[lc]==0 && lc>1) lc--; //这里和加法不一样,用while因为
	 //可能存在多个前导零。 
	 if(flag==1)  cout<<"-";
	 for(int i=lc;i>0;i--)
	 	cout<<c[i];
	return 0;
}

高精度乘法
还是和前面的高精度加法和减法,有很多类似的地方,核心就是,要找到c[i+j-1]+=a[i]*b[j](可以到纸上写一写)然后就是这里的双层循环了。

#include <bits/stdc++.h>
using namespace std;
char s1[2005],s2[2005];
int a[2005],b[2005],c[2005];
int main()
{
	int la,lb,lc;
	scanf("%s",s1);
	scanf("%s",s2);
	la=strlen(s1);
	lb=strlen(s2);
	for(int i=0;i<la;i++)
	{
		a[la-i]=s1[i]-'0';		
	}
	for(int i=0;i<la;i++)
	{
		b[lb-i]=s2[i]-'0';
	}
	lc=la+lb;  //两个数相乘最大数位数不会超过 两者位数之和
	for(int i=1;i<=la;i++)
	{
		for(int j=1;j<=lb;j++)  //在纸上画一画,小学乘法 
		{
			c[i+j-1]+=a[i]*b[j];
			c[i+j]+=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	 }
	 if(c[lc]==0 && lc>0) lc--;
	 for(int i=lc;i>0;i--)
	 	printf("%d",c[i]);
	 return 0;
} 

高精度除法(高精度除以低精度)
逐位试商法, 这里是用一个高精度的数除以一个低精度得数,那么如何进行操作了?首先,定义需要用到得量,字符数组用于存储被除数,这里和前面得有所不同,将字符数转换为数字直接存放在a中就可以了,因为我们在用逐商试余法时,进行的就是,从高位到低位,在核心部分,我们用到了一个x,这个x说白了就是,一个余数,初始化为零,注意,对于全局变量来说,他是默认为0的,这个余数进行乘10操作,并加被除数数组的下一位当作下一轮的被除数,就像这样,从被除数中,不断的取一位,进行和除数相除得到一个商和一个余数,这个余数乘以10再和被除数数组的下一位相加作为被除数

#include <iostream>
#include <cstring>
using namespace std;
char s1[5005];  //被除数
long long b,c[5005],x,a[5005],la,lc;
int main()
{
	cin>>s1>>b;
	la=strlen(s1);
	for(int i=1;i<=la;i++) a[i]=s1[i-1]-'0';
	for(int i=1;i<=la;++i)
	{
		c[i]=(x*10+a[i])/b;
		x=(x*10+a[i])%b;
	}
	lc=1;
	while(c[lc]==0 && lc<la) lc++; //删除前导零 
	for(int i=lc;i<=la;++i) cout<<c[i]; 
	return 0;
 } 
//输入:4321
//		21
 //输出:
//	205

高精度除以高精度
待更新


给我点个赞再走呗。

https://www.bilibili.com/video/BV1LA411v7mt?p=5&spm_id_from=pageDriver

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:04:24  更:2022-03-16 22:06:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:23:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码