*********************************第一部分*******************************************************************
***********************************************************************************************************************
# 輸入excel的行號,輸出對應列的序號(從0開始編號)
# 相當于:26進制用a-z表示,將其轉化為10進制,即:輸入a輸出0,輸入b輸出1,輸入aa輸出26.。。。
strs = input('請輸入1-2個字母組成的字符串:').lower()
list_char = list(strs)
sum = 0
def sub_str(str_a, str_b):
return ord(str_a)-ord(str_b)
for index, str in enumerate(list_char[::-1]):
sum += (sub_str(str, 'a')+1) * 26 ** index
print(sum-1)
print(list_char[::-1])
*********************************第二部分*******************************************************************
***********************************************************************************************************************
題目解讀:
即 A=0,Z=25
則Z-A=25
根據進制換算,得到以下公式:
A = (A-A+1)*26^0 -1 = 0
Z = (Z-A+1)*26^0 -1 = 25
AA = (A-A+1)*26^1 + (A-A+1)*26^0 -1 = 26
AZ =?(A-A+1)*26^1 + (Z-A+1)*26^0 -1 = 51
BA =?(B-A+1)*26^1 + (A-A+1)*26^0 -1 = 52
ZA = (Z-A+1)*26^1 + (A-A+1)*26^0 -1 = 26*26=676
...............
ZBFA = (Z-A+1)*26^3 + (B-A+1)*26^2 + (F-A+1)+26^1 + (A-A+)*26^0 -1
如果輸入:ZA,那么list_char = ['Z','A'],索引為0,1
enumerate(list_char[::-1]反轉了列表,即['A','Z'],目的是反轉索引
*********************************第三部分*******************************************************************
***********************************************************************************************************************
那么,下面由這種方法,將十六進制輸出為十進制
#!/usr/bin/env/python35
# -*- coding:utf-8 -*-
# author: Keekuun
# 16進制就是逢16進1
def distance(num1, num2):
# 求與第一個數(0)的距離
if ord(num1) >= 65:
# 輸入的是A,B,C,D,E
return ord(num1) - ord(num2) - 7
else:
# 輸入的是0-9
return ord(num1) - ord(num2)
def sixteen_to_ten(num):
result = 0
for index, value in enumerate(num[::-1]):
# 分別將各個位數轉化為10進制,然后求和
result += distance(value, str('0')) * 16 ** index
# print('result=%s'%result)
return result
num = list(input('請輸入16進制數(不添加0x):').upper())
print(sixteen_to_ten(num))
*********************************第四部分**************************************************************************
***********************************************************************************************************************
-
十進制:decimal system,每一位最高為9,達不到10
-
二進制:binary system,每一位最高為1,達不到2
-
八進制:octonary number system,每一位最高為7,達不到8
-
十六進制:hexadecimal,每一位最高為?1515?或者?0xf0xf,取不到16(那就是0xG0xG了,:-D)。
推論:
-
如果一個數為25,則它的進制不低于6進制;
-
自然也可以這樣理解,如果一個數的某一位的取值范圍為?[0,m?1][0,m?1],則該數即為?mm進制;
>>> 0b1010
10 # 也即python原生語法是支持二進制表示
>> 0xff 255 # 自然也支持八進制
向十進制轉換
int(string, base)# 第一個參數標識:需要轉換的原始的數據,以字符串的形式表示# 第二個參數標識:原始數據的base或者叫本身的進制表示 # 2:二進制 # 8:八進制 # 16:表示16進制 # 最終轉化為十進制
?
二進制 ? 十進制
>>> int('1010', 2)
10
?
十六進制 ? 十進制
>>> int('f', 16)
15
>>> int('0xf', 16) 15 >>> int('0xff', 16) 255
?
八進制 ? 十進制
>>> int('17', 8)
15 # 15 = 7*8^0+1*8^1
?
向16進制轉化
hex(string)# 也即沒有進制的設置# 只接受10進制# 為實現其他進制的轉換,可先轉換為十進制使用int()# 返回位字符串類型
>>> hex(1033)
'0x409'>>> hex(int('101010', 2)) '0x2a' >>> hex(int('17', 8)) '0xf'
?
向二進制轉換
bin(十進制整型)
>>> bin(10)
'0b1010'>>> bin(int('ff',16)) '0b11111111' >>> bin(int('17',8)) '0b1111'
向八進制轉換
oct()# 不同于hex/bin# 通過參數進行判斷# 其是二進制、十進制、16進制# 也即oct函數可將任意進制的數轉換為8進制
>>> oct(0b1010)
'012'
>>> oct(11) '013' >>> oct(0xf) '017'
向?m進制
?的轉換
不斷的對m
求模取余,余數為當前位(低位向高位),商新的被除數,支持商為0。
例,我們以十進制的25向3進制轉換;
25/3 ? 8(1)?
8/3 ? 2(2)?
2/3 ? 0(2)
則25的三進制表示為?221
,1?30+2?31+2?32=251?30+2?31+2?32=25
def base(x, m):ms = []while x: ms.append(x%m) x //= m # python 3 # //:表示整除,保留整數部分 // /:得float類型 return ms