蓝桥杯--进制转换--10进制与26进制转换中的问题
一、问题描述
题目描述:A=1, B=2, C=3,…Z=26, AA=27, AB=28, AC=29…AZ=52, BA=53,… ZZ=702, …
以此类推。按照这个规律请你请写出函数判断:
1.字母编号序列LANQIAO表示的数为多少?
2.2021用字母怎么表示?
二、问题分析
2.1规律解析
按照给定的表示方法,可以知道这是进制转化的题目,将10进制和26进制进行相互转化,我们已经熟悉10进制和2、8、16进制之间的相互转化。首先,给出基本的进制转化方法。
2.2 十进制<---->二、八、十六进制
- 一、10进制化2进制: 整数采用除基数再倒取余数法。小数部分采用乘基数再取整数法。
-
①.正整数转2进制--->除2取余,然后倒序排列,高位补零。
-
将正的十进制数除以二,得到的商再除以二,依次类推直到
-
商为0或1时为止,然后在旁边标出各步的余数.最后对余数倒序。
-
42转化为2进制为(8字节):00101010
-
②.负整数转2进制---->先将正整数部分化为2进制,再取反,再加1;
-
-42转化为2进制(8字节):
-
1.正整数部分转化 00101010,
-
2.转化结果取反 11010101,
-
3.转反结果加1 11010110,
- ③.小数转2进制---->先将整数部分化成2进制,再按照小数部分化为2进制。
-
对小数点以后的数乘以2,取结果的整数部分(不是1就是0),然后再用小数部分再乘以2,
-
再取结果的整数部分……以此类推,直到小数部分为0或者位数已经够了就满足。
-
最后将小数的整数部分和小数部分连在一起,注意整数部分是倒序,小数部分是正序。
-
0.125转化为2进制(8字节): 0.001
-
5.125转化为2进制(8字节):
-
1. 5转化为2进制:101
-
2. 0.125转化为2进制:001
-
3. 5.125转化为2进制:101.001
- 二、2进制转化为10进制:
-
①.2进制正整数转化为10进制(补齐后首位为0)
-
按照基数的顺序从右边指数为0开始相乘再相加
-
1010 = 1*2*2*2 + 0*2*2 + 1*2 +0*1 = 10
-
②.2进制负整数转化为10进制(补齐后首位为1)
-
补齐字节后首位为1,先取反再换算。
-
转化11101011: 1.取反 -00010100 2. 换算 -20
-
③.2进制小数转化为10进制:小数部分从左边往右(基数的指数部分:-1,-2,-3.....)
- 三、对于8进制和16进制乃至26进制的转化方法都是一样:
-
-
整数采用除基数再倒取余数法。小数部分采用乘基数再取整数法。
-
2.3二进制<---->八进制、十六进制
- 一、2进制化为8、16进制
-
将一个二进制数化为8进制时候,在二进制中连续取三位数字,分别化为整数,所得结果即为8进制数。
-
将一个二进制数化为16进制时候,在二进制中连续取四位数字,分别化为整数,所得结果即为16进制数。
-
11001化为8进制数:从最右边开始以3位为一组,不够三位补0.
-
001:1
-
011:3
-
结果为:31
-
111001.10101化为8进制数:从小数点开始往左右以3位为一组,不够三位补0.
-
0.10101:0.52
-
101:5
-
010:2
-
001:1
-
111:7
-
结果为:71.52
- 一、8、16进制化为2进制
-
将一个8进制化为2进制数时候,在8进制中每一个数值化为三位数字,所得结果即为2进制数。
-
将一个16进制化为2进制数时候,在16进制中每一个数值化为四位数字,所得结果即为2进制数。
-
42(8进制)化为2进制:100010
-
42(16进制)化为2进制:01000010
三、26进制转化为10进制
-
A=1,B=2,C=3....Z=26,AA=27,AB=28...AZ=52,BA=53,...ZZ=702...
-
将输入的26进制取出每一个位的值,然后乘上26的指数(指数从右到左:0,1,2,3,4...)
-
26进制ZZ化为10进制:Z*26¹ + Z*26° = 26*27 = 702
-
26进制ZBC化为10进制:Z*26² + B*26¹+ C*26° = 17576+52+3 = 17631
四、10进制转化为26进制
比如给定的一个数53、2021,现在将两个十进制数化为26进制的字符表示:
十进制转化为26进制的方法和十进制转化为2、8、16进制方法十类似的:除以基数取余再倒序。
五、10进制转化26进制中出现的问题及方法
5.1问题提出
上述给出了26进制转化为10进制和10进制转化为26进制的一般方法,但是对于10进制转化为26进制而言,会出现特殊情况。在10进制转化为2、8、16进制时候,最小是从0开始的。比如二进制的01,八进制的01234567…,十六进制的0123456789A…都是从0开始,而26进制是从A(1),B(2)开始的,就会出现一个问题:当遇到26的整数倍时候余数为0,应该怎么表示?
5.2 问题解决
比如这里的52,用26进制表示应该为:AZ,但是按照一般的转换方法却不能转化到AZ。
通过观察Z(26)、AZ(52)、BZ(78)、ZZ(702)、等含有"Z"的进制关系可以得到:
设m为整除26的余数,如果余数等于0,那么令m=26,同时将当前的商减1;之后在进行相除取余…
例如702:ZZ
只要在循环的时候判断当前的余数,然后给出条件设置就满足了。
六 java代码
下面给出了两个方法,分别十将十进制转化为26进制,将26进制转化为10进制。
class Transform {
/**
* @param num 表示输入的十进制数值
* @return 输出一个字符串表示26进制数值。
*/
public String toChar(int num) { //转化为26进制
String s = "";
int n=num,r=num,m;
boolean flag = true;
while(flag){
//循环求余数
n = r;
m = n%26;
r = n/26;
//判断是否倍26整除
if(m==0) {
m=26;
r = r-1;
}
//将26进制余数化为字符表示
s = (char)(m+64)+ s;
if(r==0)
break;
}
return s;
}
/**
* @param s 表示传入的大写字母,这里以字符串表示
* @return 返回26进制的大写字符表示的十进制数
*/
public int toNum(String s) { //转化为10进制
int num = 0;
for(int i=s.length()-1,j=0;i>=0;i--,j++) {
num = (int) (num + (s.charAt(i)-64) * Math.pow(26, j));
//大写字母A的ascall码为65,将A转化为1,B转化为2....
}
return num;
}
}
测试结果为:
参考:
链接: link.