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
原文地址:https://www.cnblogs.com/xiaolaji/p/9124938.html