高精度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;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] 最后得到结果,消去前导零输出,注意和加法不同的是这里用的是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;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
	{
		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 
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 
#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<la) lc++; //删除前导零 
	for(int i=lc;i<=la;++i) cout<<c[i]; 
	return 0;
 } 
//输入:4321
//		21
 //输出:
//	205

高精度除以高精度
待更新


给我点个赞再走呗。
习题 阶乘之和
题目描述
高精度计算出 S=1!+2!+3!+⋯+n!(n≤50)。
其中“!”表示阶乘,例如:5!=5×4×3×2×1。
输入格式
一个正整数n。
输出格式
一个正整数 S,表示计算结果。
输入输出样例
输入
3
输出
9
说明/提示
【数据范围】
对于 100% 的数据 1≤n≤50。

#include 
using namespace std;
int a[120];
int b[120];
void add(int *a,int *b) //高精度加
{
	int jw=0;
	for(int i=1;i<=120;i++)
	{
		b[i]=b[i]+a[i]+jw;
		jw=b[i]/10;
		b[i]%=10;
	}
}
void cheng(int *a,int c)  //高精度乘
{
	int jw=0;
	for(int i=1;i<=120;i++)
	{
		a[i]=a[i]*c+jw;
		jw=a[i]/10;
		a[i]=a[i]%10;
	}
}
int main()
{
	int n;
	cin>>n;
	a[1]=1;
	for(int i=1;i<=n;i++) //从1开始乘
	{
		cheng(a,i);
		add(a,b);
	}
	bool flag=0;
	for(int i=120;i>=1;i--)
	{
		if(b[i]!=0) flag=1;
		if(flag) cout<<b[i];
	}
	return 0;
}

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

你可能感兴趣的:(数据结构入门学习,c++,算法,c语言)