进制转化

B O
相信大家对于进制转换都已经十分熟悉了吧,本题的要求就是让你实现进制的转换,为了降低难度,这个题只需要在2进制和8进制之间进行相互转换就好了。

例如,若给你的是一个2进制数1101.1011,那它转换为8进制之后应该是15.54,若给你的是一个8进制数30,那它转换为2进制之后应该是11000。

输入格式:
多组输入。

每组输入在一行中给出一个正整数和一个字符串,分别代表输入的数是几进制和输入的数。

输入保证小数点后一定有数字。

输出格式:
对于每组输入输出一行。

若输入的数是2进制,输出转换完成之后的8进制数;若输入的数是8进制,输出转换完成之后的2进制数。

输出时,整数部分不要有前导零,小数部分不要有后缀零。

输入样例:
2 1101.1011
8 30
2 0.1
8 0.1
2 0.0
8 007
输出样例:
15.54
11000
0.4
0.001
0
111

#include <bits/stdc++.h>

using namespace std;
int base;
string str, out;

void Trans_2_8() {
    string fir = "", sec = "";
    bool flag = false;
    for (int i = 0; i < str.size(); i++) {
        if (str[i] == '.') {
            flag = true;
            continue;
        }
        if (!flag)
            fir += str[i];
        else
            sec += str[i];
    }
    //cout << fir << '*' << sec << endl;
    if (fir.size() % 3 == 1) fir = "00" + fir;
    if (fir.size() % 3 == 2) fir = "0" + fir;
    if (sec.size() % 3 == 1) sec += "00";
    if (sec.size() % 3 == 2) sec += "0";
    //cout << fir << ' ' << sec << endl;
    for (int i = 0; i < fir.size(); i += 3) {
        string ss = "";
        ss += fir[i];
        ss += fir[i+1];
        ss += fir[i+2];
        //cout << "! " << ss << endl;
        if (ss == "000") out += '0';
        else if (ss == "001") out += '1';
        else if (ss == "010") out += '2';
        else if (ss == "011") out += '3';
        else if (ss == "100") out += '4';
        else if (ss == "101") out += '5';
        else if (ss == "110") out += '6';
        else if (ss == "111") out += '7';
    }
    if (flag) {
        out += '.';
        for (int i = 0; i < sec.size(); i += 3) {
            string ss = "";
            ss += sec[i];
            ss += sec[i+1];
            ss += sec[i+2];
            if (ss == "000") out += '0';
            else if (ss == "001") out += '1';
            else if (ss == "010") out += '2';
            else if (ss == "011") out += '3';
            else if (ss == "100") out += '4';
            else if (ss == "101") out += '5';
            else if (ss == "110") out += '6';
            else if (ss == "111") out += '7';
        }
    }
}

void Trans_8_2() {
    for (int i = 0; i < str.size(); i++) {
        if (str[i] == '0') out += "000";
        else if (str[i] == '1') out += "001";
        else if (str[i] == '2') out += "010";
        else if (str[i] == '3') out += "011";
        else if (str[i] == '4') out += "100";
        else if (str[i] == '5') out += "101";
        else if (str[i] == '6') out += "110";
        else if (str[i] == '7') out += "111";
        else out += '.';
    }
}

void Check(){
    string tmp = out;
    bool flag = false, flag1 = false;
    out = "";
    for (int i = 0;i < tmp.size(); i++){
        if (tmp[i] != '0')
            flag = true;
	if (tmp[i] == '.')
	    flag1 = true;
        if (flag)
            out += tmp[i];
    }
    if (flag1){
        while (out[out.size() - 1] == '0')
            out.pop_back();
    }
    if (out[0] == '.')
        out = '0' + out;
    if (out[out.size() - 1] == '.')
        out.pop_back();
}

int main() {
    //freopen("in", "r", stdin);
    ios::sync_with_stdio(false);
    while(cin >> base >> str){
        out = "";
        if (base == 2)
            Trans_2_8();
        else
            Trans_8_2();
        Check();
        cout << out << endl;
    }
    return 0;
}

题目描述

黑豹是瓦坎达的国王,瓦坎达是世界上最繁华的地方,它拥有世界最先进的科技,那究竟有多么先进呢?

最近刚研究成功一款新游戏机,进制转换机。

这个进制转换机可以完成 22进制和1616进制数字之间的相互转换,只要输入输入数字的进制数和要输入的数字然后按“确定”键便可以在显示屏显示出结果。例如,输入 1616 进制数 F.EF.E,按下"确定"键后显示屏就会显示 1111.1111111.111,

但是进制转换机显示屏上不仅会显示转换完成的数字,如果这个数字是一个回文数字的话,他还会在结果前面多输出一句Beautiful

注:"回文数”是一个正读和反读都一样的数字,例如:10001,11011,0101010001,11011,01010都是回文数字。B图片.jpg

输入描述

多组输入,每组输入占一行。

对于每组输入在一行中给出一个正整数 base 和一个字符串 str,分别代表输入数字的进制和输入的数字, basebase值为 22 或 1616,保证 sum |str| le 10^6∑∣str∣≤10
6

输出描述

对于每组输入在一行中输出转换结果。

注:1616进制中的字母请输出大写字母,整数部分请不要输出前导零,小数部分不要输出后缀零。

样例输入 1

16 F.E
2 1111.1111
16 0.0
16 E
样例输出 1

1111.111
Beautiful F.F
Beautiful 0
1110

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;

int base, acnt, awcnt;
char ans[400100], answer[400100];
string s;
map<char, string> dic16;
map<string, char> dic2;

int main() {
	dic16['0'] = string("0000");dic2[string("0000")] = '0';
	dic16['1'] = string("0001");dic2[string("0001")] = '1';
	dic16['2'] = string("0010");dic2[string("0010")] = '2';
	dic16['3'] = string("0011");dic2[string("0011")] = '3';
	dic16['4'] = string("0100");dic2[string("0100")] = '4';
	dic16['5'] = string("0101");dic2[string("0101")] = '5';
	dic16['6'] = string("0110");dic2[string("0110")] = '6';
	dic16['7'] = string("0111");dic2[string("0111")] = '7';
	dic16['8'] = string("1000");dic2[string("1000")] = '8';
	dic16['9'] = string("1001");dic2[string("1001")] = '9';
	dic16['A'] = string("1010");dic2[string("1010")] = 'A';
	dic16['B'] = string("1011");dic2[string("1011")] = 'B';
	dic16['C'] = string("1100");dic2[string("1100")] = 'C';
	dic16['D'] = string("1101");dic2[string("1101")] = 'D';
	dic16['E'] = string("1110");dic2[string("1110")] = 'E';
	dic16['F'] = string("1111");dic2[string("1111")] = 'F';
	while (cin >> base >> s) {
		memset(ans, 0, sizeof(ans));
		acnt = 0;
		memset(answer, 0, sizeof(answer));
		awcnt = 0;
		int len = s.length();
		int dot = 0;
		if (base == 16) {
			for (int i = 0; i < len; i++) {
				if (s[i] == '.') {
					ans[acnt++] = '.';
					dot = i;
					continue;
				}
				string res = dic16[s[i]];
				for (int j = 0; j < 4; j++) ans[acnt++] = res[j];
			}
		}
		else if (base == 2) {
			for (int i = 0; i < len; i++)
				if (s[i] == '.') dot = i;
			if (dot) {
				int llen = dot, rlen = len - dot - 1;
				int cur = dot - 1;
				for (int i = llen / 4 + (llen % 4 ? 1 : 0); i >= 1; i--) {
					string res = string("0000");
					for (int j = 3; j >= 0 && cur >= 0; j--) {
						res[j] = s[cur--];
					}
					ans[i - 1] = dic2[res];
					acnt++;
				}
				ans[acnt++] = '.';
				cur = dot + 1;
				for (int i = rlen / 4 + (rlen % 4 ? 1 : 0); i >= 1; i--) {
					string res = string("0000");
					for (int j = 0; j <= 3 && cur < len; j++) {
						res[j] = s[cur++];
					}
					ans[acnt++] = dic2[res];
				}
			}
			else {
				int cur = len - 1;
				for (int i = len / 4 + (len % 4 ? 1 : 0); i >= 1; i--) {
					string res = string("0000");
					for (int j = 3; j >= 0 && cur >= 0; j--) {
						res[j] = s[cur--];
					}
					ans[i - 1] = dic2[res];
					acnt++;
				}
			}
		}
		//for (int i = 0; i < acnt; i++) printf("%c", ans[i]);
		//printf("
");
		int begin = 0, end = 0x3fffffff;
		for (int i = 0; i < acnt; i++)
			if (ans[i] != '0') {
				begin = i;
				break;
			}
		if (dot) for (int i = acnt - 1; i >= 0; i--)
			if (ans[i] != '0') {
				end = i;
				break;
			}
		for (int i = 0; i < acnt; i++)
			if (begin <= i && i <= end) answer[awcnt++] = ans[i];
		if (answer[0] == '.') answer[0] = '0', awcnt = 1;
		bool ok = true;
		for (int i = 0; i <= awcnt / 2; i++)
			if (answer[i] != answer[awcnt - i - 1]) ok = false;
		if (ok) printf("Beautiful ");
		for (int i = 0; i < awcnt; i++) printf("%c", answer[i]);
		printf("
");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/xcfxcf/p/12301603.html