• P1604 B进制星球


    题目背景

    进制题目,而且还是个计算器~~

    题目描述

    话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球。因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用B(2<=B<=36)进制计数。星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成B进制加法的计算器给他们。 现在小Z希望你可以帮助他,编写实现B进制加法的程序。

    输入输出格式

    输入格式:

    共3行第1行:一个十进制的整数,表示进制B。第2-3行:每行一个B进制数正整数。数字的每一位属于{0,1,2,3,4,5,6,7,8,9,A,B……},每个数字长度<=2000位。

    输出格式:

    一个B进制数,表示输入的两个数的和。

    输入输出样例

    输入样例#1: 复制
    4
    123
    321
    
    输出样例#1: 复制
    1110

    说明

    进制计算器

    看到这道题打算用map做,map 的优点是能将字符于整形数直接一一对应起来,这样就和十进制的高精度加法没什么区别了。

    代码如下:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main()
    {
    
        map<char, int> a;//每一个字符所对应的的数值;
        for(int i=0; i<=9; i++)
        {
            a[i+'0']=i;
        }
        for(int i=10; i<=35; i++)
        {
            a[i-10+'A']=i;
        }
        /*
        循环后的效果如下;
        a["0"]=0;a["1"]=1;a["2"]=2;a["3"]=3;a["4"]=4;a["5"]=5;a["6"]=6;
        a["7"]=7;a["8"]=8;a["9"]=9;a["A"]=10;a["B"]=11;a["C"]=12;a["D"]=13;
        a["E"]=14;a["F"]=15;a["G"]=16;a["H"]=17;a["I"]=18;a["J"]=19;a["K"]=20;
        a["L"]=21;a["M"]=22;a["N"]=23;a["O"]=24;a["P"]=25;a["Q"]=26;a["R"]=27;a["S"]=28;
        a["T"]=29;a["U"]=30;a["V"]=31;a["W"]=32;a["X"]=33;a["Y"]=34;a["Z"]=35;
        */
        map<int, char> b;//每一个数值所对应的字符;
        for(int i=0; i<=9; i++)
        {
            b[i]=i+'0';
        }
        for(int i=10; i<=35; i++)
        {
            b[i]=i-10+'A';
        }
        /*
        循环后的效果如下;
        b[0]="0";b[1]="1";b[2]="2";b[3]="3";b[4]="4";b[5]="5";b[6]="6";
        b[7]="7";b[8]="8";b[9]="9";b[10]="A";b[12]="B";b[13]="C";b[13]="D";
        b[14]="E";b[15]="F";b[16]="G";b[17]="H";b[18]="I";b[19]="J";b[20]="K";
        b[21]="L";b[22]="M";b[23]="N";b[24]="O";b[25]="P";b[26]="Q";b[27]="R";b[28]="S";
        b[29]="T";b[30]="U";b[31]="V";b[32]="W";b[33]="X";b[34]="Y";b[35]="Z";
        */
        int n;
        scanf("%d",&n);
        char p[2010],q[2010];
        char pp[2010],qq[2010];//做加法处理的两个串(由输入的两个字符串倒叙而来);
        for(int i=0; i<2010; i++) //这里一定要都预处理为'0',(不是清空),后面的加法时就不用考虑最后一位的情况了。
        {
            pp[i]='0';
            qq[i]='0';
        }
        scanf("%s%s",&p,&q);
        int p1=strlen(p);
        int q1=strlen(q);
        int k=0;
        for(int i=p1-1; i>=0; i--)
        {
            pp[k++]=p[i];
        }
        k=0;
        for(int i=q1-1; i>=0; i--)
        {
            qq[k++]=q[i];
        }
        for(int i=0; i<max(p1,q1); i++) //这里和十进制的高精度加法一样,先看和是否超了n进制,超了就进位
        {
            if(a[pp[i]]+a[qq[i]]<n)
            {
                pp[i]=b[a[pp[i]]+a[qq[i]]];
            }
            else
            {
                pp[i]=b[a[pp[i]]+a[qq[i]]-n];
                pp[i+1]=b[a[pp[i+1]]+1];
            }
        }
        if(pp[max(p1,q1)]!='0')//看最后一位是否进位了,这里p++,q++只是为了让输出位数加一;
        {
            p1++;
            q1++;
        }
        for(int i=max(p1,q1)-1; i>=0; i--)
        {
            printf("%c",pp[i]);
        }
        printf("
    ");
        return 0;
    }
    View Code
  • 相关阅读:
    luogu3242 接水果 (整体二分+树状数组)
    [BZOJ3449] [Usaco2014 Feb]Secret Code
    [BZOJ2821] 作诗(Poetize)
    [BZOJ2434] [Noi2011]阿狸的打字机
    [BZOJ1212] [HNOI2004]L语言
    [JZOJ100026]【NOIP2017提高A组模拟7.7】图
    [BZOJ2467] [中山市选2010]生成树
    [Luogu3868] [TJOI2009]猜数字
    [POJ1006] Biorhythms
    [BZOJ2733] [HNOI2012]永无乡
  • 原文地址:https://www.cnblogs.com/xiaolaji/p/9124938.html
Copyright © 2020-2023  润新知