2024/8/5

高精度算法

高精度计算,也被称作大整数计算,运用了一些算法结构来支持更大整数间的运算。

高精度加法计算

#include<iostream>
#include<cstring>
using namespace std;
string s1,s2;//定义两个字符串存储输入的数字
int a[5000],b[5000],c[5000];
int la,lb,lc;//加数长度与和的长度
int main()
{
	cin>>s1>>s2;//输入
	la=s1.length();
	lb=s2.length();

	//转换类型,将数字顺序反转,存入数组a,b;
	int i;
	for(i=0;i<la;i++)
	a[la-i]=s1[i]-'0';
	for(i=0;i<lb;i++)
	b[lb-i]=s2[i]-'0';

	//计算和的长度
	lc=max(la,lb)+1;

	//计算
	for(i=1;i<=lc;i++)
	{
		c[i]+=a[i]+b[i];//加数a的第i位与加数b的第i位相加,存入结果c的第i个元素

		//进位
		c[i+1]=c[i]/10;
		c[i]=c[i]%10;
	}
	if(c[lc]==0&&lc>0)lc--;//去掉数字开头的0
	for(i=lc;i>0;i--)//倒序输出
	cout<<c[i];
}

高精度减法计算

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int flag=0;
string s1,s2;//定义两个字符串存储输入的数字
int a[5000],b[5000],c[5000];
bool com(string s1,string s2)//比较两个数大小
{
    int a=s1.length();
    int b=s2.length();
    if(a!=b) return a>b;
    int i;
    for(int i=0;i<a;i++)
    if(s1[i]!=s2[i]) return s1[i]>s2[i];
    return true;
}
int main()
{
    cin>>s1>>s2;
    if(!com(s1,s2))//如果s1比s2小
    {
        flag=1;//标记结果为负数
        swap(s1,s2);//交换被减数与减数的位置
    }
    int la=s1.length();
    int lb=s2.length();
    int i;

    //转换类型,将数字顺序反转,存入数组a,b;
    for(i=0;i<la;i++)
    a[la-i]=s1[i]-'0';
    for(i=0;i<lb;i++)
	b[lb-i]=s2[i]-'0';
    
    //确定结果的长度
    int lc=max(la,lb);

    //计算
	for(i=1;i<=lc;i++)
	{
        //借位
		if(a[i]<b[i])
		{
			a[i+1]--;
			a[i]+=10;
		}
		c[i]=a[i]-b[i];
	}
	if(c[lc]==0&&lc>0)lc--;//去0
	if(flag==1)printf("-");//如果结果是负数就输出‘-’
	for(i=lc;i>0;i--)//输出
	cout<<c[i];
}

高精度乘法计算

#include <iostream>
using namespace std;
string s1,s2;//定义两个字符串存储输入的数字
int a[5000],b[5000],c[5000];
int la,lb,lc;//加数长度与和的长度
int main()
{
    cin>>s1>>s2;//输入
	la=s1.length();
	lb=s2.length();

	//转换类型,将数字顺序反转,存入数组a,b;
	int i;
	for(i=0;i<la;i++)
	a[la-i]=s1[i]-'0';
	for(i=0;i<lb;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--;//去开头的0
    for(i=lc;i>0;i--) cout<<c[i];//输出
    return 0;
}

高精度数除以低精度数

#include <iostream>
using namespace std;
string s1;//高精度数
int b/*低精度数*/,c[500],x,a[500],la,lc;
int main()
{
    cin>>s1>>b;//输入
    la=s1.length();//被除数长度
    int i;
    //转换类型
    for(i=1;i<=la;i++)
    a[i]=s1[i-1]-'0';
    //使用试商法计算
    for(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>0) lc--;
    for(i=lc;i<=la;++i)
        cout<<c[i];
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值