flameking


私信TA

用户名:201914040128

访问量:2494

签 名:

等  级
排  名 14451
经  验 814
参赛次数 0
文章发表 3
年  龄 19
在职情况 学生
学  校 HUAS
专  业 计科

  自我简介:

解题思路:明白十进制的加法:逢十进一, 借一当十,其他进制数类似;

注意事项:在10进制以上的进制数,有这样的对应关系:10-A,11-B,12-C,13-D,14-E,15-F,我们可以用map来进行对应,计算时利用键,而存储结果时利用值;

参考代码:

#include <bits/stdc++.h>
#define maxlongint 1001
#define limit 30
using namespace std;

char str[maxlongint] = {0};
char result[maxlongint] = {0};
map<int, char>mybinary;

void initial()// 处理10进制数以上进制的转换
{
    for(int i=0; i<10; i++)
        mybinary[i] = '0'+i;
    for(int i=10; i<16; i++)
        mybinary[i] = i-10+'A';
}

bool judge(char *str, int flag) //判定是否位回文数
{
    int left = 0, right = flag-left;
    while (left<right)
    {
        if(str[left] != str[right])
            break;
        else
        {
            left++;
            right--;
        }
    }
    if(left < right)
        return false;
    else
        return true;
}

int main()
{
    int binary; //进制数(2,8,10,16)
    initial();

    cin >> binary;
    scanf(" %s", str);  //给定进制数;

    int flag = strlen(str)-1;
    int cot = 0; //计算执行加法的次数;
    while (cot++ < limit)
    {
        int left = 0, right = flag-left;
        int mod = 0; //处理进位;
        int tmt;

        while (left <= flag)
        {
            /*以下的两条if结构处理(10-A,11-B,12-C,13-D,14-E,15-F)*/
            if('A'<=str[left] && str[left]<='F')
                str[left] -= 7;
            if('A'<=str[right] && str[right]<='F')
                str[right] -= 7;

            tmt = (str[left]-'0') + (str[right]-'0') + mod;
            result[left] = mybinary[tmt%binary];
            mod = tmt/binary;
            left++;
            right--;
        }
        if(mod == 1)
        {
            result[left] = 1+'0';
            flag++;
        }
        if(judge(result, flag))
            break;
        else
            strcpy(str, result);
    }
    if(cot > limit)
        cout << "Impossible!" << endl;
    else
        cout << "STEP=" << cot << endl;
    return 0;
}


 

0.0分

3 人评分

  评论区