洛谷 高精度

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

#include
#include
#include
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;iint
    for(int i=0;iint
    int lmax=la>lb?la:lb;
    for(int i=0;i=0;i--) ans+=na[i]+'0';//逆序保存到字符串中即为答案
    return ans;
}
int main()
{
    string a,b;
    cin>>a>>b;
    cout<

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

#include
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<1)) b[0]--;
        for(i=b[0];i>=1;i--)
        cout<s2.length()) return 0;  
    if(s1.length()s2[i]) return 0;
        if(s1[i]

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

#include
#include
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<

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

#include
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
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='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='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=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<

你可能感兴趣的:(ACM)