对于相关进制问题大约都是十进制与其余进制相互之间的转换问题,首先介绍数学的解题思想,进而通过java语言进行实现。
一、其余进制传化为十进制。
例1:十六进制转为十进制
十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……
假设有一个十六进数 2AF5, 转化为十进制用竖式计算: 2AF5换算成10进制: 第0位: 5 * 16^0 = 5 第1位: F * 16^1 = 240 第2位: A * 16^2 = 2560 第3位: 2 * 16^3 = 8192 + ------------------------------------- 10997
直接计算就是:
5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997 。
例2:八进制转为十进制
八进制数的第0位的权值为8的0次方,第1位的权值为8的1次方,第2位的权值为8的2次方……
假设有一个八进制数625.1,转化为十进制直接计算为:
625.1=6×82+6×81+5×80+1×8-1=384+16+5+0.125=405.125 。
例3:二进制转为八进制
与上文同理。假设有二进制数1101,转为十进制数直接计算为:
1101 = 1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8 = 13 。
总结:除掉十进制以外的其余进制数转为十进制数,方法为:将该数的各位数,分别与相应的权值乘积求和即可。
下面的代码是利用Java API 中提供的方法实现的。
//其他进制数转为十进制
import java.util.Scanner;
public class JinZhi {
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
String a = in.next();
long i = Long.parseLong(a, 16); //以给定基数进行解析
System.out.println(i);
}
}
其中的Long.parseLong(String s,int radix);方法起到了关键的作用,其中s为要进行转化的数据,若改数据为8进制数,则后面的radix即为8,;若数据为16进制数,同理radix就为16.以此类推。即可完成其余进制数转化为十进制数的转化。
下面代码为十六进制数转化为十进制数的代码,它的解题思想还是根据数学方法利用java语言的语法规范进行书写的! 自己写的,为了体现思想与语言之间的紧密联系。
import java.util.Scanner;
public class JinZhi {
public static void main (String args[])throws Exception{
Scanner sc = new Scanner(System.in);
String s=sc.next(); //获取十六进制数,字母必须要大写
char c[]=s.toCharArray(); //将字符串放入数组中,以便之后对各各位数进行操作
int n=c.length;
long sum=0; //记录最后的和,也就是转换后的十进制数
for(int i=0;i<n;i++){ //对各项进行乘积求和
if((int)c[i]-55>9){ //如果是字母,代表的数就大于9,A的则需要进行对照
if(c[i]=='A')
sum+=10*Math.pow(16,n-i-1);
else if(c[i]=='B')
sum+=11*Math.pow(16,n-i-1);
else if(c[i]=='C')
sum+=12*Math.pow(16,n-i-1);
else if(c[i]=='D')
sum+=13*Math.pow(16,n-i-1);
else if(c[i]=='E')
sum+=14*Math.pow(16,n-i-1);
else if(c[i]=='F')
sum+=15*Math.pow(16,n-i-1);
}
else{ //如果是数字,直接进行乘积求和
sum+=((int)c[i]-48)*Math.pow(16,n-i-1);
}
}
System.out.println(sum);
}
}
二、十进制转为其余进制。
例1:十进制转为十六进制
十进制数23785转为十六进制,则用23785/16=1486余9,1486/16=92余14,92/16=5余12,5/16=0余5,十六进制中,10对应为a、11对应为b、。。。。。。、15对应为f,再将余数倒写为5ce9,则十进制23785=十六进制5ce9。
例2:十进制数转为八进制
十进制数转为八进制数23785,则23785/8 = 2973余1,2973/8=371余5,371/8=46余3,46/8=5余6,5/8=0余5,再将余数倒写为56351。
总结:十进制数转化为其余进制数,方法为:将该数除以相应进制求余数,最后将所得余数倒序书写即为相应进制的数。
※对于十进制以外的进制数进行转化只需要通过十进制数作为中间处理即可。
首先,介绍一个万能的十进制数转化其余进制的方法(自写):
import java.util.Scanner;
public class 进制转换通用代码 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m;
int n = sc.nextInt(); //要进行进制转化的数
int M = sc.nextInt(); //要将十进制数n转成的进制类型
String s = new String();
//十进制以下的进制数转化
if(M < 10)
{
if( n == 0)
{
System.out.print(0);
}
while(n%M != 0 || n/M != 0)
{
m = n%M;
s =(char)(m+48)+s;
n = n/M;
}
}
//十进制以下的进制数转化
if(M > 10)
{
if( n == 0 )
{
System.out.print(0);
}
while(n%M != 0 || n/M != 0)
{
m = n%M;
if(m > 9)
{
s = (char)(m+55)+s;
}
else{
s = (char)(m+48)+s;
}
n = n/M;
}
}
System.out.print(s);
}
}
其中,n为要转化的数,而M,为要转化的进制形式。实现的方式较为神奇的是While的判定条件。
下面的代码是利用Java API 中提供的方法实现的。
//十六进制数转化为八进制
import java.util.Scanner;
public class 十六进制转八进制{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int i = (int)Long.parseLong(s, 16); //完成十六进制数到十进制数的转化
System.out.print(Integer.toOctalString(i)); //完成十进制数到八进制数的转化
//其中 Integer.toBinaryString(i);方法可以完成十进制数到二进制的转化,Integer.toHexSting(i);可以完成十进制数到十六进制数的转化
}
}
下面代码为十进制数转化为十六进制数的代码,它的解题思想还是根据数学方法利用java语言的语法规范进行书写的! 自己写的,为了体现思想与语言之间的紧密联系。(与上文同理)
import java.util.Scanner;
public class JinZhi3 {
public static void fun(int m) //利用递归
{
if(m < 10) //首先判断
System.out.print(m);
else if(m == 10)
System.out.print("A");
else if(m == 11)
System.out.print("B");
else if(m == 12)
System.out.print("C");
else if(m == 13)
System.out.print("D");
else if(m == 14)
System.out.print("E");
else if(m == 15)
System.out.print("F");
if(m >= 16)
{
int temp = m/16;
int temp2 = m%16;
if(temp >=16)
{
fun(temp);
}
else if(temp < 10)
System.out.print(temp);
else if(temp == 10)
System.out.print("A");
else if(temp == 11)
System.out.print("B");
else if(temp == 12)
System.out.print("C");
else if(temp == 13)
System.out.print("D");
else if(temp == 14)
System.out.print("E");
else if(temp == 15)
System.out.print("F");
if(temp2 < 10)
System.out.print(temp2);
else if(temp2 == 10)
System.out.print("A");
else if(temp2 == 11)
System.out.print("B");
else if(temp2 == 12)
System.out.print("C");
else if(temp2 == 13)
System.out.print("D");
else if(temp2 == 14)
System.out.print("E");
else if(temp2 == 15)
System.out.print("F");
}
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
fun(i);
}
编程解决问题,应该更加注重解题的思想与语言实现之间的联系,当然更好的利用API提供的方法可以更加有效率的解决相应的问题,但是并不能很好的理解解题的过程与思路的建立。