专项复习1 高精度

Posted liuziwen0224

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了专项复习1 高精度相关的知识,希望对你有一定的参考价值。

高精度

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
%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
%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 高精度的主要内容,如果未能解决你的问题,请参考以下文章

动态SQL基础概念复习(Javaweb作业5)

GLSL-片段着色器不同部分的精度不同

n阶高精度乘法,(求高阶阶乘)

算法基础| 高精度算法详解

PHP 精度计算引发的灾难性Bug

NOIP算法总结与复习