高精度运算

高精度运算 高精度算法是一种模拟算法

由于操作的对象为很大的数 我们可以使用字符串 字符串在C++有三种定义方式:

char a[100];
char *b;
string c;

对于string, 我们可以到oi-wiki进行查询

高精度算法的本质是竖式运算 为了使运算简单,我们使用vector vector的定义为:

vector<type> a; 对于vector, 我们可以到oi-wiki进行查询

通过以上的算法基础,我们可以列出一个大纲

使用字符数组存储数字 将字符数组转换成整型数组 循环相加,以位数最多者的位数作为次数 处理进位 判断最后的进位是否舍弃,并逆序输出 以下为本蒟蒻的高精度计算代码 加法

#include <bits/stdc++.h>
using namespace std;

int n1[100000],
    n2[100000],
    n3[100000];
int l1, l2, l3;
string nn1, nn2;

int main() {
    cin >> nn1 >> nn2;

    l1 = nn1.length();
    l2 = nn2.length();
    l3 = max(l1, l2);

    for(int i=0; i<l1; i++) 
        n1[l1-i-1] = nn1[i]-'0'; 
    for(int i=0; i<l2; i++) 
        n2[l2-i-1] = nn2[i]-'0'; 

    for(int i=0; i<l3; i++) {
        if(n3[i]+n2[i]+n1[i] > 9) {
            n3[i] += n1[i]+n2[i]-10;
            n3[i+1] ++;
        }else{
            n3[i] += n1[i]+n2[i];
        }
    }

    if(n3[l3]) l3++;
    for(int i=l3-1; i>=0; i--) 
        cout << n3[i];

    return 0;
}

减法

#include <bits/stdc++.h>
using namespace std;

int n1[100000],
    n2[100000],
    n3[100000];
int l1, l2;
string nn1, nn2;

int main() {
    cin >> nn1 >> nn2;

    l1 = nn1.length();
    l2 = nn2.length();

    if(l1<l2 || (l1==l2 && nn1<nn2)) {
        cout << "-";
        swap(l1, l2);
        swap(nn1, nn2);
    }

    for(int i=0; i<l1; i++) 
        n1[l1-i-1] = nn1[i]-'0'; 
    for(int i=0; i<l2; i++) 
        n2[l2-i-1] = nn2[i]-'0'; 

    int i;
    for(i=0; i<l1; i++) {
        n3[i] = n1[i]-n2[i];
        if(n3[i] < 0) {
            n3[i]+=10;
            n1[i+1]--;
        }
    }

    while(n3[i]==0 && i>0) i--;
    for(; i>=0; i--) 
        cout << n3[i];

    return 0;
}

乘法

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

string nn1, nn2;
int n1[100000],
    n2[100000],
    n3[100000];
int l1, l2, l3;

int main () {
    cin>>nn1>>nn2;
    l1=nn1.length();
    l2=nn2.length();
    l3=l1+l2;

    for(int i=1; i<=l1; i++)
        n1[i]=nn1[l1-i]-'0';
    for(int i=1; i<=l2; i++)
        n2[i]=nn2[l2-i]-'0';

    for(int i=1; i<=l2; i++) 
        for(int j=1; j<=l1; j++)
            n3[i+j-1]+=n1[j]*n2[i];
    for(int i=1; i<l3; i++) 
        if(n3[i]>9) {
            n3[i+1]+=n3[i]/10;
            n3[i]%=10;
        }

    while(n3[l3]==0&&l3>1) l3--;
    for(int i=l3; i>=1; i--) cout<<n3[i];
    return 0;
}

除法

 #include <bits/stdc++.h>
using namespace std;

string x;
long long b;
long len, last = 0, y = 0;
int  a[10000000], res[10000000];
int main() {
    cin >> x >> b;

    len = x.length();
    for (int i = 0; i < len; i++)
        a[i] = x[i] - '0';

    for (int i = 0; i < len; i++) {
        res[i] = (y * 10 + a[i]) / b;
        y = (y * 10 + a[i]) % b;
    }

    while (res[last] == 0 && last < len - 1) last++;
    for (int i = last; i < len; i++) cout << res[i];
    return 0;
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值