试题 基础练习 十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。
这道题的限制比较多,因为最开始说的是十六进制数的长度不超过100000,
而long类型才十九位,肯定不能用系统自带的进制转换方法,需要自己写

一、代码

import java.util.Scanner;
public class _12_16into8 {
	public static void main(String[] args) {
	  Scanner sc=new Scanner(System.in);
	  int number=sc.nextInt();
	  String[] input = new String[number];
	  for(int i=0;i<number;i++){
		  input[i]=sc.next();
	  }
	  
	  //遍历输入的每一个数
	  for(int i=0;i<number;i++){	
		  //设temp_size为第i个数的长度
		  int temp_size=input[i].length();
		  StringBuilder temp_builder=new StringBuilder();
		  //将第i个数转的16进制转变为2进制
		  for(int j=0;j<temp_size;j++){
			  switch(input[i].charAt(j)){
			  case '0':temp_builder.append("0000");break;
			  case '1':temp_builder.append("0001");break;
			  case '2':temp_builder.append("0010");break;
			  case '3':temp_builder.append("0011");break;
			  case '4':temp_builder.append("0100");break;
			  case '5':temp_builder.append("0101");break;
			  case '6':temp_builder.append("0110");break;
			  case '7':temp_builder.append("0111");break;
			  case '8':temp_builder.append("1000");break;
			  case '9':temp_builder.append("1001");break;
			  case 'A':temp_builder.append("1010");break;
			  case 'B':temp_builder.append("1011");break;
			  case 'C':temp_builder.append("1100");break;
			  case 'D':temp_builder.append("1101");break;
			  case 'E':temp_builder.append("1110");break;
			  case 'F':temp_builder.append("1111");break;
			  }
		  }
		  StringBuilder eight_builder=new StringBuilder();
		  temp_builder=temp_builder.reverse();
		  
		  //将第i个数转的二进制数转变为八进制
		  for(int count=0;count<temp_builder.length();count=count+3){
			  String temp=new String();
			  StringBuilder tem=new StringBuilder(); 
			  int stemp=0;
			  if(count+3<temp_builder.length()){
			  //String反转,用StringBuilder做中介
				  temp=temp_builder.substring(count, count+3);
				  tem=new StringBuilder(temp);
				  tem=tem.reverse();
				  temp=tem+"";
			  }else{
				  temp=temp_builder.substring(count, temp_builder.length());
				  
				  
				  //substring的用法
	/*			  String str = "Hello Java World!";

				  Method1:  substring(int beginIndex)

				        返回从起始位置(beginIndex)至字符串末尾的字符串

				        str.substring(2);

				        //return "llo Java World!";

				   

				  Method2:  substring(int beginIndex, int endIndex)

				        返回从起始位置(beginIndex)到目标位置(endIndex)之间的字符串,但不包含目标位置(endIndex)的字符

				        str.substring(2,4);

				        //return "ll";
*/				  
				  
				  tem=new StringBuilder(temp);
				  tem=tem.reverse();
				  temp=tem+"";
				  int key=0;
				  for(int p=0;p<temp.length();p++){
					  if(temp.charAt(p)=='1'){
						  key=1;
					  }					 
				  }
				  if(key==0){
					  break;
				  }
			  }
			  for(int k=0;k<temp.length();k++){
				  switch( temp.charAt(k)  ){
				  case '1':stemp+=Math.pow(2, temp.length()-1-k);break;
				  case '0':break;
				  }
			  }
			  eight_builder=eight_builder.append(stemp);
		  } 
		  System.out.println(eight_builder.reverse());
		 }
		 
	  }
	
}

二、总结:

1.Integer.parseInt(String s, int radix) : 将s当作radix进制返回s的十进制, Long.parseLong(String s, int radix) : 将s当作radix进制返回s的十进制
但是Float.parseFloat只能将数字转化为float型,而不能进行进制之间的转换

2.substring(beginIndex,endIndex) //[beginIndex,endIndex)

3.String反转,用StringBuilder做中介
temp=temp_builder.substring(count, count+3);
tem=new StringBuilder(temp);
tem=tem.reverse();
temp=tem+"";

4.为什么Long.parseLong最多只能转换19位数字,Long最大不是64位么?
long类型的最大值是9223372036854775807,刚好长度是19个数字。你说的64位 应该说的是2的64次方。

5.在这里插入图片描述

三、参考:

1.java基本数据类型的范围
2.Java parseInt()和parseFloat()的用法
3.进制转换-Java中自带方法解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值