7- 基础练习 十六进制转八进制

时间:2021-10-02 11:18:18

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

}