zoukankan      html  css  js  c++  java
  • 7- 基础练习 十六进制转八进制

    http://lx.lanqiao.cn/problem.page?gpid=T51

    问题描述
      给定n个十六进制正整数,输出它们对应的八进制数。

    输入格式
      输入的第一行为一个正整数n (1<=n<=10)。
      接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

    输出格式
      输出n行,每行为输入对应的八进制正整数。

      【注意
      输入的十六进制数不会有前导0,比如012A。
      输出的八进制数也不能有前导0。

    样例输入
      2
      39
      123ABC

    样例输出
      71
      4435274

      提示
      先将十六进制数转换成某进制数,再由某进制数转换成八进制。

    注意: java很容易超时的,要尽量优化,如可以枚举的就枚举好,做好字典;字符串拼接,注意不用stringBuilder和StringBuffer,不要用string;

           java尽量避免复杂度乘以2都可能导致超时!!!

    傻逼超时解法:

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner cin =  new Scanner(System.in);
    		
    		int n = cin.nextInt();
    		cin.nextLine();   //吃掉回车
    		String[] a = new String[n];
    		for(int i = 0 ; i < n; i++) {
    			a[i] = cin.nextLine().trim();
    //			System.out.println("--" + a[i]);
    		}
    
    		for(int j = 0; j < n; j++) {
    			String bastr = "";
    			for(int i = 0; i < a[j].length(); i++) {
    				char[] tp = {'0', '0','0', '0'};
    				int t;
    				if(a[j].charAt(i) > '9') {
    					t = (a[j].charAt(i) - 'A') + 10;
    				}
    				else {
    					t = a[j].charAt(i) - '0';
    				}
    				//	System.out.println("at:" + a[0].charAt(i));
    				int ct = 3;
    				while(t != 0) {
    					tp[ct--] = (char) ((t % 2) + '0');
    					t = t / 2;
    				}
    				String str = new String(tp);
    				//	System.out.println(str);
    				bastr = bastr + str;
    			}
    			
    //			System.out.println(bastr);
    			int s = bastr.length() % 3;
    			if(s > 0) {
    				for(int i = 0; i < 3 - s; i++) {
    					bastr ="0" + bastr;
    				}
    			}
    			StringBuilder ba = new StringBuilder();
    			for(int i = 0 ; i < bastr.length(); i += 3) {
    				//	System.out.println(bastr.charAt(i) + bastr.charAt(i+1) + bastr.charAt(i+2));
    				ba.append( String.valueOf( (bastr.charAt(i) - '0') * 4 + (bastr.charAt(i+1) - '0') * 2 + (bastr.charAt(i+2) - '0') * 1));
    			}
    			System.out.println(ba.toString().replaceAll("^(0+)", ""));
    		}
    
    	}
    
    }
    

     

    c++不超时版:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    string str;
    string two[17] = {"0000", "0001", "0010", "0011",
    "0100", "0101", "0110", "0111",
    "1000", "1001", "1010", "1011",
    "1100", "1101", "1110", "1111"};
    
    int main(){
    	int n;
    	cin >> n;
    	while(n--){
    		cin >> str;
    		string ss;
    		string ans;
    		for(int i = 0; i < str.length(); i++){
    			if(str[i] >= '0' && str[i] <= '9'){
    				ss += two[str[i] - '0']; 
    			}
    			else{
    				ss += two[str[i] - 'A' + 10];
    			}
    		}
    //		cout << ss << endl;
    		int sum = 0;
    		for(int i = ss.length() - 1; i >= 0; i--){
    			if(i == 1){
    				if(ss[i] == '0' && ss[i - 1] == '0'){
    					break;
    				}
    				sum = (ss[i] - '0') * 1 + (ss[i - 1] - '0') * 2;	
    				ans += (sum + '0');
    //					cout << sum << "i " << i << endl;
    				break;			
    			}
    			else if(i == 0){
    				if(ss[i] == '0'){
    					break;
    				}
    				sum = (ss[i] - '0') * 1; 	
    				ans += (sum + '0');
    //					cout << sum << "i " << i << endl;
    				break;
    			}
    			else{
    				sum = (ss[i] - '0') * 1 + (ss[i - 1] - '0') * 2 + (ss[i - 2] - '0') * 4;	
    				ans += (sum + '0');
    				i -= 2;
    //				cout << sum << "i " << i << endl;
    			}
    		}
    		int flag = 0;
    		for(int i = ans.length() - 1; i >= 0; i--){
    			char ch = ans[i]; 
    //			if(ch != '0' || flag == 1){
    				cout << ans[i];
    				flag = 1;
    //		/	}
    //			else if(flag == 1){
    //				cout << ans[i];
    //			}
    		}
    		cout << endl ;
    	}
    
    	return 0;
    }
    

      

    java不超时版:

    一:

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner cin = new Scanner(System.in);
    		int n = cin.nextInt();
    		String[] str = new String[n];
    		for(int i = 0; i < n; i++) {
    			str[i] = cin.next();
    		}
    //		cin.close();
    		
    		for(int i = 0; i < n; i++) {
    			String strBinary = toBinay(str[i]);
    //			System.out.println(strBinary);
    			int len = strBinary.length();
    			if(len % 3 == 1) {
    				strBinary = "00" + strBinary;
    			}
    			else if(len % 3 == 2) {
    				strBinary = "0" + strBinary;
    			}
    			String strBa = toBa(strBinary);
    			System.out.println(strBa);
    		}
    	}
    	public static String toBa(String str) {
    		StringBuffer ans = new StringBuffer();
    		int len = str.length();
    		int k = 0;
    		if(str.substring(0,3).equals("000")) {
    			k = 3;
    		}
    		else {
    			k = 0;
    		}
    		for(int i = k; i < len - 2; i+=3) {
    			switch(str.substring(i, i+3)) {
    				case "000": ans.append("0"); break;
    				case "001": ans.append("1"); break;
    				case "010": ans.append("2"); break;
    				case "011": ans.append("3"); break;
    				case "100": ans.append("4"); break;
    				case "101": ans.append("5"); break;
    				case "110": ans.append("6"); break;
    				case "111": ans.append("7"); break;
    			}
    		}
    		return ans.toString();
    	}
    	public static String toBinay(String str) {
    		StringBuffer ans = new StringBuffer();
    		int len = str.length();
    		for(int i = 0; i < len; i++) {
    			switch(str.charAt(i)) {
    				case '0': ans.append("0000"); break;
    				case '1': ans.append("0001"); break;
    				case '2': ans.append("0010"); break;
    				case '3': ans.append("0011"); break;
    				case '4': ans.append("0100"); break;
    				case '5': ans.append("0101"); break;
    				case '6': ans.append("0110"); break;
    				case '7': ans.append("0111"); break;
    				case '8': ans.append("1000"); break;
    				case '9': ans.append("1001"); break;
    				case 'A': ans.append("1010"); break;
    				case 'B': ans.append("1011"); break;
    				case 'C': ans.append("1100"); break;
    				case 'D': ans.append("1101"); break;
    				case 'E': ans.append("1110"); break;
    				case 'F': ans.append("1111"); break;
    			}
    		}
    		return ans.toString();
    	}
    }
    

      

    二:

    import java.util.Scanner;
    
    public class Main2 {
    
    	public static void main(String[] args) {
    		
    		// TODO Auto-generated method stub
    		Scanner cin =  new Scanner(System.in);
    		String[] two = {
    				"0000", "0001", "0010", "0011",
    				"0100", "0101", "0110", "0111",
    				"1000", "1001", "1010", "1011",
    				"1100", "1101", "1110", "1111",
    				}; 	
    
    		int n = cin.nextInt();
    //		cin.nextLine(); //吃掉回车
    		while(n > 0) {
    			n--;
    			String str = cin.next();
    			//转为二进制
    //			String ans = "";     //string 在大量拼接时会超时
    //			int len = str.length();
    //			for(int i = 0; i < len; i++) {
    //				if(str.charAt(i) < 'A') {
    //					ans = ans + two[str.charAt(i) - '0'];
    //				}
    //				else {
    //					ans = ans + two[str.charAt(i) - 'A' + 10];
    //				}
    //			}
    			int len = str.length();
    //			StringBuffer ans = new StringBuffer(len);  //一下如果用String会超时,stringbuffer和stringbuilder都可以
    			StringBuilder ans = new StringBuilder();
    			for (int i = 0; i < len; i++) {
    				if (str.charAt(i) < 'A' && str.charAt(i) >= '0') {
    					ans.append(two[str.charAt(i) - '0']);
    				} 
    				else {
    					ans.append(two[str.charAt(i) - 'A' + 10]);
    				}
    			}
    			String ans2 = ans.toString();
    //			System.out.println("ans2" + ans2);
    			//凑齐3的倍数
    			int len2 = ans2.length();
    			if(len2 % 3 == 1) {
    				ans2 = "00" + ans2;
    			}
    			else if(len2 % 3 == 2){
    				ans2 = "0" + ans2;
    			}
    			//开始转为八进制
    			int k = 0;
    			if(ans2.substring(0, 3).equals("000")) {
    				k = 3;
    			}
    			else {
    				k = 0;
    			}
    			len2 = ans2.length();
    			StringBuilder ansout = new StringBuilder();
    			for(int i = k; i < len2 - 2; i += 3) {
    				int ten = (ans2.charAt(i) - '0') * 4 + (ans2.charAt(i+1) - '0') * 2 + (ans2.charAt(i+2) - '0');
    				ansout.append(String.valueOf(ten) );
    			}
    			System.out.println(ansout);
    		}
    		cin.close();
    	}
    
    }
    

      

      

      

  • 相关阅读:
    vue 富文本编译器 vue-quill-editor
    vue-拖拽的使用awe-dnd
    Dapper是什么?
    如何运用领域驱动设计
    面试官问我MySQL索引,我
    MySQL:你知道什么是覆盖索引吗?
    mysql覆盖索引与回表
    C#.NET 字符串转数组,数组转字符串
    MYSQL如何让主键使用BTREE索引
    MySQL大表优化方案 Mysql的row_format(fixed与dynamic)
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/10300986.html
Copyright © 2011-2022 走看看