码迷,mamicode.com
首页 > 其他好文 > 详细

专项复习1 高精度

时间:2020-01-28 21:32:49      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:基本   cst   char s   can   一个   --   代码   楼梯   ring   

高精度

1 高精度加法 LGP1601

啥也不说,直接上代码

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
char ans1[505],ans2[505];
int num1[505],num2[505],numans[510];
int len1,len2,lent;
int main(){
    scanf("%s\n%s",ans1+1,ans2+1);
    len1=strlen(ans1+1);
    len2=strlen(ans2+1);
    for(int i=1,j=len1;i<=len1;i++,j--){
        num1[i]=ans1[j]-'0';
    }
    for(int i=1,j=len2;i<=len2;i++,j--){
        num2[i]=ans2[j]-'0';
    }
    lent=max(len1,len2)+1;
    for(int i=1;i<=lent;i++){
        numans[i]=num1[i]+num2[i];
    }
    for(int i=1;i<=lent;i++){
        if(numans[i]>=10){
            numans[i+1]+=(numans[i]/10);
            numans[i]%=10;
        }
    }
    while(numans[lent]==0&&lent>1) lent--;
    for(int i=lent;i>=1;i--){
        printf("%d",numans[i]);
    }
    return 0;
}

2 数楼梯 LGP1255

题解

斐波那契数列+高精度,基本上没什么改动

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath> 
using namespace std;
int a[5001][1202];
int n;
//bool pd; 
int pd;
int main(){
    a[0][1]=0;
    a[1][1]=1;
    a[2][1]=2;
    scanf("%d",&n);
    for(int i=3;i<=n;i++){
        for(int j=1;j<1200;j++){
            a[i][j]=a[i-1][j]+a[i-2][j];
        }
        for(int j=1;j<1200;j++){
            while(a[i][j]>9){
                a[i][j+1]++;
                a[i][j]-=10;
            }
        }
    }
    for(int i=1200;i>1;i--){
        if(!pd&&a[n][i]==0) continue;
        pd=1;
        printf("%d",a[n][i]);
    }
    printf("%d",a[n][1]);
    return 0;
}

3 \(B\)进制星球 LGP1604

题解

其实就是一个万能的高精度,\(B\)进制就是逢\(B\)进1,以前的\(\mod 10\)、÷10都变成\(\mod B\),剩下的和高精度相同,注意字母和数字的转换(我用了两个函数)

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int mod;
char ans1[2020],ans2[2020];
int num1[2020],num2[2020],numans[4050];
int len1,len2,lent;
int che(char s){
    if(s>='0'&&s<='9') return (s-'0');
    return (s-'A'+10);
}
char ret(int s){
    if(s>=0&&s<=9) return (s+'0');
    return('A'+s-10);
}
int main(){
    scanf("%d",&mod);
    scanf("%s\n%s",ans1+1,ans2+1);
    len1=strlen(ans1+1);
    len2=strlen(ans2+1);
    for(int i=1,j=len1;i<=len1;i++,j--){
        num1[i]=che(ans1[j]);
    }
    for(int i=1,j=len2;i<=len2;i++,j--){
        num2[i]=che(ans2[j]);
    }
    lent=max(len1,len2)+1;
    for(int i=1;i<=lent;i++){
        numans[i]=num1[i]+num2[i];
    }
    for(int i=1;i<=lent;i++){
        if(numans[i]>=mod){
            numans[i+1]+=(numans[i]/mod);
            numans[i]%=mod;
        }
    }
    while(numans[lent]==0&&lent>1) lent--;
    for(int i=lent;i>=1;i--){
        printf("%c",ret(numans[i]));
    }
    return 0;
}

专项复习1 高精度

标签:基本   cst   char s   can   一个   --   代码   楼梯   ring   

原文地址:https://www.cnblogs.com/liuziwen0224/p/fuxi1.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!