高精度算法之草根逆袭之路

本文详细介绍了如何使用C++实现高精度的竖式加法、减法和乘法,通过数组模拟高精度数字的运算过程,包括字符串转整数、进位处理和去除前置零等关键步骤。
摘要由CSDN通过智能技术生成

高进度算法

适用情况

int 10的9次方数量级
lomg long 10的18次方数量级
对于高精度数采用高精度算法解决
算法核心:【竖式加法】

高精度加法

解决方案:用数组模拟高精度

c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;

完整代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int la,lb,lc;
    int a[500]={0},b[500]={0},c[501]={0};
    string s1,s2;
    cin>>s1>>s2;

    la=s1.length();
    lb=s2.length();
    lc=max(la,lb)+1;

    for(int i=0;i<la;i++)
      a[i]=s1[la-1-i]-'0';
    for(int i=0;i<lb;i++)
      b[i]=s2[lb-1-i]-'0';

    for(int i=0;i<lc;i++)
    {
        c[i]+=a[i]+b[i];
        c[i+1]=c[i]/10;
        c[i]=c[i]%10;
    }

    if(c[lc-1]==0&&lc>1)  \\消除前置0
      lc--;

    for(int i=lc-1;i>=0;i--)
      cout<<c[i];
    
    return 0;
}

高精度减法

要点:

  1. 如果a<b,则需要交换a与b。
  2. 如果a[i]<b[i],需要高位借一当十使用。
if(a[i]<b[i])
{
  a[i+1]--;
  a[i]=a[i]+10;
}
c[i]=a[i]-b[i];

完整代码:

#include<iostream>
#include<string>
using namespace std;

int compare(string a, string b) {
    if (a.length() > b.length())
        return 1;
    else if (a.length() < b.length())
        return -1;
    else if (a.length() == b.length()) {
        if (a > b) return 1;
        else if (a < b) return -1;
    }
    return 0;
}  \\用于比较两个字符串转化为数后的大小

int main() {
    string a, b, c;
    cin >> a >> b;
    
    if (compare(a, b) < 0) {
        c = a;
        a = b;
        b = c;
        cout << "-";
    }
    
    int la = a.length();
    int lb = b.length();
    int lc = max(la, lb);
    int s1[10090] = {0}, s2[10090] = {0}, s3[10090] = {0};
    
    for (int i = 1; i <= la; i++)
        s1[i] = a[la - i] - '0';
    
    for (int i = 1; i <= lb; i++)
        s2[i] = b[lb - i] - '0';
    
    for (int i = 1; i <= lc; i++) {
        if (s1[i] < s2[i]) {
            s1[i + 1]--;
            s1[i] += 10;
        }\\判断是否借位
        s3[i] = s1[i] - s2[i];
    }
    
    while (lc > 1 && s3[lc] == 0)
        lc--;\\注意用while,减法可能会出现多位前置零
    
    for (int i = lc; i >= 1; i--)
        cout << s3[i];
    
    return 0;
}
}

高精度乘法

要点:

  1. 位置对应:
    a[i]*b[i]对应c[i]的位置
  2. 考虑进位:
    c[i+j-1]+=a[i]*b[j];
    c[i+j]+=c[i+j-1]/10;
    c[i+j-1]%10;
    
    

完整代码:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1,s2;
	cin>>s1>>s2;
	
	int la,lb,lc;
	la=s1.length();
	lb=s2.length();
	lc=la+lb;  \\注意位数
	
	int a[10000]={0},b[10000]={0},c[10000]={0};
	for(int i=1;i<=la;i++)
	    a[i]=s1[la-i]-'0';
	for(int i=1;i<=lb;i++)
	    b[i]=s2[lb-i]-'0';  
		
	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>1) lc--; \\注意前置零
	for(int i=lc;i>=1;i--)
	  cout<<c[i];  
	return 0;
 } ```

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值