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

高精度c++

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

高精度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 
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;i0) lc--;
	for(int i=lc;i>0;i--) 
		printf("%d",c[i]);
	return 0;
} 

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

#include 
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;is2[i];
	}
	return true;
}
int main()
{
	int la,lb,lc;
	cin>>s1>>s2;
	if(!compare(s1,s2))  //如果s11) lc--; //这里和加法不一样,用while因为
	 //可能存在多个前导零。 
	 if(flag==1)  cout<<"-";
	 for(int i=lc;i>0;i--)
	 	cout< 

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

#include 
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;i0) lc--;
	 for(int i=lc;i>0;i--)
	 	printf("%d",c[i]);
	 return 0;
} 

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

#include 
#include 
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 
//输入:4321
//		21
 //输出:
//	205

高精度除以高精度
待更新

 

给我点个赞再走呗。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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