乙個沒有 0 的計數

2022-08-23 03:39:10 字數 2262 閱讀 2813

一直以來,我都對'0'這個數字感到習以為常,'0'不就是代表沒有嘛,但當我遇到了下面這個程式設計題目時,我對'0'的意義有了新的認識,'0'的引進,絕對稱得上是計數方式的一次偉大的前進。

給定乙個正整數,返回它在 excel 表中相對應的列名稱。

例如,

1 -> a

2 -> b

3 -> c

...26 -> z

27 -> aa

28 -> ab

...

乍一看,這個題目應該是乙個十進位制與26進製的轉換的問題,但細細想來,這個題目用常規的轉換方法是無法實現的,因為a~z中是沒有對應'0'的這個值的,所以我們無法用'a0'來簡單地代表26這個值,而是用'z'這個字母來表示26,這個差異導致我們使用傳統的除26取餘的方法來構建答案會出錯,以下是我想出的兩種方法。

既然知道了列的不斷增加的法則,那麼我們可以用乙個迴圈來實現我們的求值

def inc(val):

carry = true

for i in range(len(val)-1,-1,-1):

if carry:

val[i] = chr(ord(val[i])+1)

if val[i] > 'z':

carry = true

val[i] = 'a'

else:

carry = false

if carry:

val.insert(0,'a')

def f(n):

val =

for i in range(n):

inc(val)

return "".join(val)

首先我們來分析分析一下這個題目求的究竟是什麼樣乙個結果,因為az分別表示的是126這26個值,所以我們實際上是要把乙個數n轉換成如下的形式

其中

caution:當我們計算a0的時候,不能夠直接用n模26,因為a0的最大值可以是26,所以我們應當多討論乙個特殊情況,即n mod 26 = 0 的情況,這時候a0是可以取z的。

我們再看n除以26(向下取整)的情況,因為我們的a0是可以取到26的,所以這時候要分兩種情況討論

case1: a0 ≠ 26

這時候我們可以直接繼續除下去而不產生錯誤

case2: a0=26

這時候我們要先減去殘留下來的1,繼續往下除才能避免出錯

所以我們的**如下

def int2col(n):

res = ""

while n > 0:

temp = n % 26

if temp != 0:

res = chr(ord('a')+temp-1) + res

n = int(n/26)

else:

res = 'z' + res

n = int((n-1)/26)

return res

我們在求a0的時候可以考慮先將n-1,這時候a0的範圍就從126變成了025,即變成了我們熟悉的26進製中每一位的表示方法,這時候我們只要再用n去模上26,就可以得到a0-1的值,從這裡我們可以方便地轉換為字母表示,同時n減去1後,我們也避免了一次除法過後末尾還留下乙個1的情況。實現的**如下:

def int2col2(n):

res = ""

while true:

n = n - 1

res = chr(ord('a')+n%26) + res

n = int(n / 26)

if n == 0:

break

return res

通過這個題目,我發現'0'的引入對於計數方式的確是乙個偉大的進步,它不僅擴充了「無」的表示,它還方便了我們對於各種進製之間的轉換,使得我們的計算更為簡單,使得我們的計算機在處理各種事情的時候能夠更加方便地運算,這確實是乙個不可小看的自然數。

乙個沒有 的for迴圈

如果for迴圈沒有 那麼該for迴圈預設對第一條語句進行迴圈,以 結尾就結束了。這個語法同樣適用於if while迴圈。例如下面這個例子 public class fordemo int s 0 for int i 0 i myintarray.length i if i 2 1 s myintar...

沒有物件?new乙個!

我們都知道,使用new後可返回乙個物件,通常用於例項化乙個 類 用法 function student name,age student.prototype.sayname function const person new student 小明 person.sayname i am 小明首先我們...

乙個沒有索引引起的問題

這個案例說來也很簡單。話說我們公司舊版本的 mediation 系統每天都需要從各個 network element ne 的伺服器上採集 cdr,採集程式一般都是用 expect 寫的,其實就是 ftp到對方的機器上拷貝檔案過來。ne裡的 cdr一般不會輕易做 house keep ftp登入之後...