阅读本文前建议先阅读:进制转换的概念及方法
题目解析:
十进制所代表的意义是每一位数字乘以位置代表的数值最后相加的和
比如十进制数字1234
4代表个位:也就是4*1=4
3代表十位:也就是3*10=30
2代表百位:也就是2*100=200
1代表千位:也就是1*1000=1000
1000+200+30+4=1234
根据十进制的意义,我们在将其他进制转换为十进制时,便可以通过同样的逻辑。
如八进制数字123转换为十进制数字
3*8的0次方 3*1=3
2*8的1次方 2*8=16
1*8的2次方 1*64=64
64+16+3=83
这就得到了八进制数123的十进制数字
我总结的规律是:从左往右取,依次乘以对应进制的位置次方,最后相加结果就转换成了十进制!
那么我们同程序的思维来写这个程序即:将输入的数字转为字符串倒序取出每一位(也可以通过模的方法取),通过循环去乘进制的位置次方后求和即可。
代码实现(注释较长,请左右滑动查看):
package 练习题;
public class 进制转换n转10 {
/*
* tenToN(要转换的数,转换数字的进制)
* 可以将任意进制转换为10进制,请注意输入,如果2进制转换请只能输入0~1 而8进制只能输入0~7
*/
public static int tenToN(String n,int jz) { //两个参数,n代表输入的数字,jz代表这n的进制
String shuzi=n+""; //先转换为字符串
int cf=0; //次方先定义为0
int num=0; //用于累加的变量
int ca=0;
for(int i=shuzi.length()-1;i>=0;i--) { //循环从数字的最后一位开始,因为已经转为了字符串型,可以直接通过循环取
if(shuzi.charAt(i)>=65){ //用于判断输入的是不是16进制的字符,因为字符A在ascii码中是65
if(shuzi.charAt(i)>=97) {//再次判断输入的字符是小写还是大写的,因为因为字符a在ascii码中是65,如果不做判断会计算错误
ca=shuzi.charAt(i)-'a'+10; //如果输入是小写则减去小写a也就是97再+10就得到了本该对应的数字
}else {
ca=shuzi.charAt(i)-'A'+10; //如果输入是大写则减去大写A也就是65再+10就得到了本该对应的数字
}
}else {
//charAt取 下标为i的数字,String.valueof()将 char 变量 c 转换成字符串
//因为parseint只能转String类型不能直接转char
//passeint就是将字符串转为int型
ca=Integer.parseInt(String.valueOf(shuzi.charAt(i)));
}
num+=ca*Math.pow(jz,cf); //pow(a,b)代表求数字a的b次方
//在这里一步里求出后乘以取出的这一位数字后累加结果
cf++; //次方自增 即代表 0次方 1次方 2次方 用于计算
}
return num; //循环结束后输出结果
}
public static void main(String[] args) {
System.out.println(tenToN("172",8));
System.out.println(tenToN("10101",2));
System.out.println(tenToN("a21",16));
System.out.println(tenToN("A21",16));
}
}
输出结果为:
完美解决!
PS:本题易错点在于容易忘记16进制的字符串处理~
发表评论