高精度

高精度

高精度,即无法使用 C++ 本身配置的数据类型中使用的运算

高精度加法

例题:P1601 A+B Problem

主要方法:

  • 使用字符串存储数字
  • 转换为整型数组
  • 模拟竖式加法
  • 逆序输出

Code

#include <iostream>
using namespace std;
#define MAXN 10005
string s1,s2;
int a[MAXN],b[MAXN],c[MAXN];
int main()
{
	cin>>s1>>s2; //输入
	int len1=s1.size(),len2=s2.size(); //两者的长度
	int len=max(len1,len2); //两者较长的长度
	for(int i=0;i<len1;i++) a[i]=s1[len1-1-i]-48; //逆序存储a(s1)
	for(int i=0;i<len2;i++) b[i]=s2[len2-1-i]-48; //逆序存储b(s2)
	int xx=0,i;
	for(i=0;i<len;i++)
    {
		c[i]=a[i]+b[i]+xx; //相加
		xx=c[i]/10; //处理进位
		c[i]%=10;
	}
	c[i]=xx; //处理最高位又进一位的情况
	while(c[i]==0&&i>0) i--; //删除前导0
	for(;i>=0;i--) cout<<c[i]; //反向输出
    return 0;
}

高精减

例题:P2142 A-B Problem

和上面差不多。

主要方法:

  • 使用字符串存储数字
  • 转换为整型数组
  • 模拟竖式减法
  • 逆序输出

Code

#include <iostream>
using namespace std;
#define MAXN 10005
string s1,s2;
int a[MAXN],b[MAXN],c[MAXN];
int main()
{
	cin>>s1>>s2; //输入
	int len1=s1.size(),len2=s2.size(); //两者的长度
	if(s1>s2&&len1==len2||len1<len2) //负数处理
    {
		swap(s1,s2);
		swap(len1,len2);
		cout<<"-";
	}
	for(int i=0;i<len1;i++) a[i]=s1[len1-1-i]-48; //逆序存储a(s1)
	for(int i=0;i<len2;i++) b[i]=s2[len2-1-i]-48; //逆序存储b(s2) 
	int i;
	for(i=0;i<len1;i++) //高精减法
    {
		c[i]=a[i]-b[i];
		if(c[i]<0)
        {
			a[i+1]--;
			c[i]+=10;
		}
	}
	while(c[i]==0&&i>0) i--; //删除前导0
	for(;i>=0;i--) cout<<c[i]; //反向输出
    return 0;
}

高精乘

例题:P1303 A*B Problem

主要方法:

  • 使用字符串存储数字
  • 转换为整型数组
  • 模拟竖式乘法
  • 逆序输出

Code

#include <iostream>
using namespace std;
#define MAXN 10005;
string s1,s2;
int a[MAXN],b[MAXN],c[2*MAXN];
int main(){
	cin>>s1>>s2;
	int len1=s1.size(),len2=s2.size();
	for(int i=0;i<len1;i++) a[i]=s1[len1-1-i]-48; //逆序存储a(s1)
	for(int i=0;i<len2;i++) b[i]=s2[len2-1-i]-48; //逆序存储b(s2)
	for(int i=0;i<len2;i++) for(int j=0;j<len1;j++) c[i+j]+=a[j]*b[i]; //高精乘法
	int len=len1+len2;
	for(int i=0;i<len;i++)
    {
		c[i+1]+=c[i]/10; //进位
		c[i]%=10;
	}
	while(c[len]==0&&len>0) len--; //删除前导0
	for(;len>=0;len--) cout<<c[len]; //反向输出
    return 0;
}

高精除(高精除单精)

例题:P1480 A/B Problem

主要方法:

  • 使用字符串存储数字
  • 转换为整型数组
  • 模拟竖式除法
  • 逆序输出

Code

#include <iostream>
using namespace std;
#define MAXN 10005
string s;
long long x;
int a[MAXN],c[MAXN];
int main(){
	cin>>s>>x; //输入
	int len1=s.size();
	for(int i=0;i<len1;i++) a[i]=s[i]-48; //存储 
	long long y=0;
	for(int i=0;i<len1;i++) //高精除
    {
		c[i]=(y*10+a[i])/x; //除法
		y=(y*10+a[i])%x; //不断往后推
	}
	int len=0;
	while(c[len]==0&&len<len1-1) len++; //删除前导0
	for(int i=len;i<len1;i++) cout<<c[i]; //输出
}

总结

其实高精度大部分都是模拟人类的计算方法,就比如列竖式,只要弄清楚他们,高精就能写好。

更好的阅读体验?推荐 该文

posted @ 2024-07-07 19:02  RainCQwQ  阅读(25)  评论(0)    收藏  举报