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;
}