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.

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
16进制转化10进制的方法有很多,以下是两种常用的方法: 1. 直接换法:将16进制数的每一位转化10进制数的对应数位,然后相加得到10进制数的结果。 举个例子,将16进制数0x32F换为10进制数的过程如下: ``` 3 2 F 3*(16^2)+2*(16^1)+15*(16^0)=815 ``` 所以,0x32F换为10进制数为815。 演示代码如下(C语言)[^1]: ```c #include <stdio.h> #include <stdlib.h> int main() { char hex[10]; printf("Enter the hex number: "); scanf("%s", hex); int dec = strtol(hex, NULL, 16); printf("Decimal number is %d\n", dec); return 0; } ``` 2. 除法取余法:将16进制数每一位乘以对应的权值,然后相加求和,权值为16的幂。例如对于16进制数0x32F,其每一位的权值为16^2、16^1和16^0,所以将0x32F换为10进制数的过程如下: ``` 3 2 F 16^2 16^1 16^0 -------------------- 768 32 15 ------- ``` 所以,0x32F换为10进制数为815。 演示代码如下(C语言): ```c #include <stdio.h> #include <math.h> int main() { char hex[10]; int i, length, decimal = 0; printf("Enter the hex number: "); scanf("%s", hex); length = strlen(hex); for (i = 0; hex[i] != '\0'; i++, length--) { if (hex[i] >= '0' && hex[i] <= '9') { decimal += (hex[i] - '0') * pow(16, length - 1); } else if (hex[i] >= 'a' && hex[i] <= 'f') { decimal += (hex[i] - 'a' + 10) * pow(16, length - 1); } else if (hex[i] >= 'A' && hex[i] <= 'F') { decimal += (hex[i] - 'A' + 10) * pow(16, length - 1); } } printf("Decimal number is %d\n", decimal); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值