高精度算法

简介: 本文详细介绍了高精度算法的实现,涵盖加法、减法、乘法、除法及取模等操作。通过字符串与数组结合的方式,解决了大数运算中超出数据类型范围的问题。每种运算均提供完整的C++代码示例,包括输入处理、位运算模拟、进位/借位逻辑以及结果输出。其中,高精度加法和减法通过逆序存储数字简化计算;乘法利用双重循环模拟手算过程;除法分为低精度和高精度两种情况,分别采用逐位试商与减法模拟;取模则通过逐位累加求余实现。这些方法为处理大规模数值运算提供了有效工具,适用于竞赛编程与实际开发场景。

高精度算法

作者:blue

时间:2024.9

1.高精度加法(整数部分模板)

#include <iostream>
#include <string>
using namespace std;
int a1[1000],a2[1000],ans[1000];
int main()
{
   
    string s1,s2;
    cin>>s1>>s2;//字符串存放大数
    //逆序存放在数组中 
    for(int i=0;i<s1.size();i++) a1[s1.size()-i-1]=s1[i]-'0';
    for(int i=0;i<s2.size();i++) a2[s2.size()-i-1]=s2[i]-'0';
    int len=max(s1.size(),s2.size());
    //先相加 
    for(int i=0;i<len;i++){
   
        ans[i]=a1[i]+a2[i];
    }
    //后处理进位 
    for(int i=0;i<len;i++){
   
        ans[i+1]=ans[i+1]+ans[i]/10;
        ans[i]=ans[i]%10;
    }
    //逆序输出先判断len位为不为0(因为最高位可能进位,所以最长到len位)
    for(int i=len;i>=0;i--){
   
        if(i==len&&ans[len]==0) continue;
        cout<<ans[i];
    }
    return 0;
}
AI 代码解读

2.高精度减法(整数部分模板)

#include <iostream>
#include <string>
using namespace std;
const int N=1e6+10;
int a1[N],a2[N],ans[N];
int main()
{
   
    string s1,s2;
    cin>>s1>>s2;
    char flag='+';//符号判断 
    //判断两个数谁大谁小,大的那个放置在s1,如果交换了位置,就将符号置为'-'
    if(s1.size()<s2.size()||s1.size()==s2.size()&&s1<s2){
   
        swap(s1,s2);
        flag='-';
    } 
    //倒序存放 
    for(int i=0;i<s1.size();i++) a1[i]=s1[s1.size()-i-1]-'0';
    for(int i=0;i<s2.size();i++) a2[i]=s2[s2.size()-i-1]-'0';
    for(int i=0;i<s1.size();i++){
   
        if(a1[i]<a2[i]){
   //模拟借位的过程 
            a1[i]+=10;
            a1[i+1]--;
        }
        ans[i]=a1[i]-a2[i];
    }
    //注意此处index的值设置为0是有考究的,当是两个相等大数相减的话,那就只用输出1位0 
    int index=0;//找答案中第一个不为0的位置,为输出做准备 
    for(int i=s1.size()-1;i>=0;i--){
   
        if(ans[i]>0){
   
            index=i;
            break;
        }
    } 
    if(flag=='-') cout<<flag;
    for(int i=index;i>=0;i--) cout<<ans[i];
    return 0;
}
AI 代码解读

3.高精度乘法

image-20241019090817352.png

#include <iostream>
#include <string>
using namespace std;
const int N=1e8+10;
int a1[N],a2[N],ans[N];
int main()
{
   
    string s1,s2;
    cin>>s1>>s2;
    //反转两个数 
    for(int i=0;i<s1.size();i++) a1[i]=s1[s1.size()-i-1]-'0'; 
    for(int i=0;i<s2.size();i++) a2[i]=s2[s2.size()-i-1]-'0'; 
    int len=s1.size()+s2.size();//乘法最终的长度不会长于两个常数长度的和 
    //模拟乘法过程
    for(int i=0;i<s1.size();i++){
   
        for(int j=0;j<s2.size();j++){
   
            ans[i+j]+=a1[i]*a2[j];//注意这里不是赋值语句 
            ans[i+j+1]+=ans[i+j]/10;//进位 
            ans[i+j]=ans[i+j]%10;//保留本位 
        }
    } 
    //消除前导0 
    int index=0;
    for(int i=len;i>=0;i--){
   
        if(ans[i]!=0){
   
            index=i;
            break;
        }
    }
    //倒序输出 
    for(int i=index;i>=0;i--){
   
        cout<<ans[i];
    }
    return 0;
}
AI 代码解读

4.高精度除法

高精度除以低精度

image-20241019092848282.png

#include <iostream>
#include <string>
using namespace std;
const int N=1e8+10;
int ans[N],a[N];
long long b;
int main()
{
   
    string s;
    long long x=0;//用以承接每次的余数,初始应当为0,因为没有余数,注意这里余数也要开long long 防止余数很大的情况 
    cin>>s>>b;//输入一个高精度数和一个低精度数
    //这里不用倒序存放,因为除法本身就是一个从高位计算到低位的过程 
    for(int i=0;i<s.size();i++) a[i]=s[i]-'0';
    //模拟逐位试商的过程 
    for(int i=0;i<s.size();i++){
   
        ans[i]=(x*10+a[i])/b;
        x=(x*10+a[i])%b;
    }
    int index=0;
    //消除前导0,注意此处,index不能超过被除数的长度 
    while(ans[index]==0&&index<s.size()) index++;
    for(int i=index;i<s.size();i++) cout<<ans[i];
    if(index==s.size()) cout<<"0";//如果index等于被除数的长度,那么说明商就为0,要打印0
    //cout<<" "<<x;//有需要还可以打印余数 
    return 0;
}
AI 代码解读

高精度除以高精度

高精度除高精度要用减法模拟除法

image-20241019145033990.png

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const int N=1e6+10;
int a[N],b[N],c[N],tmp[N];
void init(int a[]){
   
    string s;
    cin>>s;
    a[0]=s.size();//a[0]存储字符串的长度 
    for(int i=1;i<=s.size();i++) a[i]=s[s.size()-i]-'0';//逆序存储 
}
void print(int a[]){
   
    if(a[0]==0){
   
        cout<<"0";
        return;
    }
    for(int i=a[0];i>0;i--) cout<<a[i];
    return;
}
int compare(int a[],int b[]){
   //比较两个数的大小,如果a大返回1,如果b大返回-1,一样大返回0 
    if(a[0]>b[0]) return 1;
    if(a[0]<b[0]) return -1;
    for(int i=a[0];i>0;i--){
   
        if(a[i]>b[i]) return 1;
        if(a[i]<b[i]) return -1; 
    }
    return 0;
}
void minu(int a[],int b[]){
   //高精度减法 
    for(int i=1;i<=a[0];i++)
    {
   
        if(a[i]<b[i]){
   
            a[i]+=10;
            a[i+1]--;
        }
        a[i]=a[i]-b[i];
    }
    while(a[a[0]]==0&&a[0]>0) a[0]--;//删除前导0 
    return; 
}
void numcpy(int b[],int tmp[],int n){
   //
    for(int i=1;i<=b[0];i++) tmp[i+n]=b[i];
    tmp[0]=b[0]+n;
}
int main()
{
   
    init(a);
    init(b);
    c[0]=a[0]-b[0]+1;//两位数相除,商最长的长度 
    if(c[0]<0) c[0]=0;
    for(int i=c[0];i>=1;i--){
   
        memset(tmp,0,sizeof(tmp));
        numcpy(b,tmp,i-1);//减法模拟除法,扩展减数,和被减数一样长 
        while(compare(a,tmp)>=0){
   //减干净 
            c[i]++;
            minu(a,tmp);
        }
    }
    while(c[c[0]]==0&&c[0]>0) c[0]--;//消去前导0 
    print(c);
    //print(a);//余数 
}
AI 代码解读

5.高精度取模

蛐蛐取mod,直接拿下

4.字符串加法【算法赛】 - 蓝桥云课 (lanqiao.cn)

#include <iostream>
#include <string>
#define int long long
using namespace std;
const int mod=1e9+7;
long long long_mod(string a)
{
   
  int ans=0;
  for(int i=0;i<a.size();i++){
   
    ans=(ans*10+(a[i]-'0'))%mod;
  }
  return ans;
}

signed main()
{
   
  string a,b,res;
  cin>>a>>b;
  res=a+b;
  cout<<long_mod(res);
  return 0;
}
AI 代码解读

6.高精度

第十五届蓝桥杯C/C++B组题解——R格式_第十五届蓝桥杯c语言b组答案-CSDN博客

目录
打赏
0
24
24
3
158
分享
相关文章
振弦采集仪通过分析这些数据来评估地基的稳定性和土体的力学特性
振弦采集仪是一种常用的岩土工程测试仪器,用于测量地基或土体的动力特性。它通过固定在地面或岩土体上的振弦杆的振动来获取数据,并通过分析这些数据来评估地基的稳定性和土体的力学特性。
振弦采集仪通过分析这些数据来评估地基的稳定性和土体的力学特性
单导联心电国产化方案,赋能血压设备实现房颤早筛精准诊断
单导联心电国产化方案,赋能血压设备实现房颤早筛精准诊断
从MySQL优化到脑力健康:技术人与效率的双重提升
聊到效率这个事,大家应该都挺有感触的吧。 不管是技术优化还是个人状态调整,怎么能更快、更省力地完成事情,都是我们每天要琢磨的事。
73 23
(文章复现)考虑微网新能源经济消纳的共享储能优化配置
共享储能是可再生能源实现经济消纳的解决方案之一,在适度的投资规模下,应尽力实现储能电站容量功率与消纳目标相匹配。对此,提出了考虑新能源消纳的共享储能电站容量功率配置方法,针对储能电站投运成本最低与微能源网运行经济性最优的多目标,建立了双层规划模型,其中外层模型求解电站配置问题,内层模型求解经济消纳率及微能源网优化运行问题,使用 Karush-Kuhn-Tucker (KKT)法对模型转化求解。
算法基础(二)| 高精度算法详解
算法基础(二)| 高精度算法详解
231 0
《复杂系统突现论》读后
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
995 0
张学友演唱会成犯罪分子噩梦,阿里云云盾人发布脸对比功能将进一步提升罪犯监察力度
学友哥演唱会抓罪犯只是一个缩影,近年来,学校、医院等公众场合发生暴力事件频频发生,我们在追责的同时,如何对危险性事件再次发生做好预防是重中之重。在学校医院门口监控系统提前录入潜逃犯罪分子、精神病患者信息,安保人员可利用人脸比对发现可疑险情。
1993 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等