zoukankan      html  css  js  c++  java
  • 进制转化

    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;
    }
    
  • 相关阅读:
    交换排序:冒泡排序vs快速排序
    SSO
    MVC源码分析
    python_正则表达式概述
    (爬虫向)python_json学习笔记
    Pycharm Debug调试心得
    HTML学习二_HTML常用的行级标签,常用实体字符及表单标签
    吴恩达机器学习笔记3-代价函数II(cost function)
    吴恩达机器学习笔记2-代价函数I(cost function)
    Python面向对象1:类与对象
  • 原文地址:https://www.cnblogs.com/xcfxcf/p/12301603.html
Copyright © 2011-2022 走看看