洛谷 高精度

https://www.luogu.org/problemnew/show/P1601
高精度加法

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=505;
string add(string a,string b)//只限两个非负整数相加
{
    string ans;
    int na[L]={0},nb[L]={0};
    int la=a.size(),lb=b.size();
    for(int i=0;i<la;i++) na[la-1-i]=a[i]-'0';//翻转复制a 到 na,string->int
    for(int i=0;i<lb;i++) nb[lb-1-i]=b[i]-'0';//翻转复制b 到 nb,string->int
    int lmax=la>lb?la:lb;
    for(int i=0;i<lmax;i++) na[i]+=nb[i],na[i+1]+=na[i]/10,na[i]%=10;//诸位相加,

并进位
    if(na[lmax]) lmax++;//最高位有值,则总位数++
    for(int i=lmax-1;i>=0;i--) ans+=na[i]+'0';//逆序保存到字符串中即为答案
    return ans;
}
int main()
{
    string a,b;
    cin>>a>>b;
    cout<<add(a,b)<<endl;
    return 0;
}

https://www.luogu.org/problemnew/show/P2142
高精度减法

#include<bits/stdc++.h>
using namespace std;
int compare(string s1,string s2);
int main()
{
    string str1,str2;
    int a[10250],b[10250];
    int i;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    cin>>str1>>str2;
    a[0]=str1.length();
    for(i=1;i<=a[0];i++) a[i]=str1[a[0]-i]-'0';
    b[0]=str2.length();
    for(i=1;i<=b[0];i++) b[i]=str2[b[0]-i]-'0';
    
    if((compare(str1,str2))==0)  //*a>= *b,做按位减,并处理借位。
    {
        for(i=1;i<=a[0];i++)
        {
            a[i]-=b[i];
            if (a[i]<0) 
            {
                a[i+1]--;
                a[i]+=10;
            
            }
        }
        a[0]++;
        while((a[a[0]]==0)&&(a[0]>1)) a[0]--;
        for(i=a[0];i>=1;i--)
        cout<<a[i];
        cout<<endl;
    }
    else
    {
        cout<<'-';  //小于就输出负号
        for(i=1;i<=b[0];i++)  //做按位减,大的减小的
        {
            b[i]-=a[i];
            if (b[i]<0) 
            {
                b[i+1]--;
                b[i]+=10;
            }
        }
        b[0]++;
        while((b[b[0]]==0)&&(b[0]>1)) b[0]--;
        for(i=b[0];i>=1;i--)
        cout<<b[i];
        cout<<endl;
    }
    return 0;
}
int compare(string s1,string s2)  //比较字符串(两个数)数字的大小,大于等于返回0

,小于返回1。
{
    if(s1.length()>s2.length()) return 0;  
    if(s1.length()<s2.length()) return 1;
    for(int i=0;i<=s1.length();i++)  
    {
        if(s1[i]>s2[i]) return 0;
        if(s1[i]<s2[i]) return 1;
    }
    return 0;   
}

https://www.luogu.org/problemnew/show/P1303
高精度乘法

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    string str1,str2;
    int a[2050],b[2050],c[5000],len;    //2050位以内的两个数相乘
    int i,j;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    cin>>str1>>str2;
    a[0]=str1.length();
    for(i=1;i<=a[0];i++)    a[i]=str1[a[0]-i]-'0';
    b[0]=str2.length();
    for(i=1;i<=b[0];i++)    b[i]=str2[b[0]-i]-'0';
    memset(c,0,sizeof(c));
    for(i=1;i<=a[0];i++)   //做按位乘法同时处理进位,注意循环内语句的写法。
        for(j=1;j<=b[0];j++)
        {
            c[i+j-1]+=a[i]*b[j];
            c[i+j]+=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
    len=a[0]+b[0]+1;  //去掉前导0,然后输出
    while((c[len]==0)&&(len>1)) len--;  
    for(i=len;i>=1;i--)    cout<<c[i];
    return 0;
}

https://www.luogu.org/problemnew/show/P1255
斐波那契高精度保存

#include<bits/stdc++.h>
using namespace std;
int n,len=1,f[5003][5003];//第一维表示到某台阶方案数,第二维存高精度的各位
void hhh(int k)//高精度加法,k表示台阶数 
{    
    int i;
    for(i=1;i<=len;i++)
        f[k][i]=f[k-1][i]+f[k-2][i];
    for(i=1;i<=len;i++)              
    {
        if(f[k][i]>=10)
        {
            f[k][i+1]+=f[k][i]/10;
            f[k][i]=f[k][i]%10;
            if(f[k][len+1])len++;
        }
    }
}
int main()
{
    int i;
    scanf("%d",&n);
    f[1][1]=1; f[2][1]=2;         
    for(i=3;i<=n;i++)             
        hhh(i);                         
    for(i=len;i>=1;i--)
        printf("%d",f[n][i]);
    return 0;
}

https://www.luogu.org/problemnew/show/P1604
两个B进制数相加,求结果

#include<bits/stdc++.h>
using namespace std;
const int L=2005;
string add_Base(string a,string b,int Base)
{
    int maxl,na[L]={0},nb[L]={0};
    int la=a.length(),lb=b.length();
    maxl=la>lb?la:lb;
    for(int i=0;i<la;i++)
    {
        if(a[i]>='0'&&a[i]<='9')
            na[la-i-1]=a[i]-'0';
        else na[la-i-1]=a[i]-'A'+10;
    }
    for(int i=0;i<lb;i++)
    {
        if(b[i]>='0'&&b[i]<='9')
            nb[lb-i-1]=b[i]-'0';
        else nb[lb-i-1]=b[i]-'A'+10;
    }
    for(int i=0;i<maxl;i++)
    {
        na[i]+=nb[i];
        if(na[i]>=Base)
        {
            na[i+1]+=na[i]/Base;
            na[i]%=Base;
        }
    }
    if(na[maxl]) maxl++;
    while(na[maxl--]==0&&maxl>0);
    maxl++;

    string ans;
    for(int i=maxl;i>=0;i--)
    {
        if(na[i]>=0&&na[i]<=9) ans+=('0'+na[i]);
        else ans+=('A'+na[i]-10);
    }
    return ans;
}

int main()
{
    string a,b;
    int Base;
    cin>>Base>>a>>b;
    cout<<add_Base(a,b,Base);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值