需求:給定一個不超過5位的正整數,判斷該數的位數,依次打印出個位、十位、百位、千位、萬位的數字。
1 while True: 2 a = input("Please enter a number: ") 3 a = int(a) 4 if (a >= 100000) | (a < 0): 5 print("請輸入一個不超過5位的正整數!") 6 else: 7 if a >= 1000: 8 if a >= 10000: 9 num = 5
10 else: 11 num = 4
12 else: 13 if a >= 100: 14 num = 3
15 elif a >= 10: 16 num = 2
17 else: 18 num = 1
19 print("這是一個" + str(num) + "位數!") 20 c = a 21 print("從個位到萬位的位數為:") 22 for i in range(num): 23 n = c // 10
24 k = c - n*10
25 print(k,end=' ') 26 c = n 27 print('\n')
我們來分析一下這個程序,首先是分功能實現需求。第一行是一個while循環,保證程序不間斷的輸入數字,防止輸入一次就退出程序(PS:當然這個程序不完整,如果輸入的不是數字的話,還是會退出程序並且報錯。)。
然后2~19行是實現判別輸入的數字是幾位數的功能,因為需求是不超過五位數的正整數,那么我們在判別的時候可以采取“折中”的判別方式,如第7行,我們以1000這個四位數為分割點。這樣的好處是提高程序的運行效率。
第4、5行是限制輸入正整數的范圍,如果用戶輸入的數字不滿足需求的話,那么給出提示信息。
從第20行開始,便是開始實現個位數、十位數、百位數……的數字。c = a,這里為什么不直接調用a這個變量呢?還要將a再賦值給變量c呢?為了程序的可拓展性,防止在后續的程序代碼中再次使用a,這樣的話能更好的明白a變量到底是哪個數值。
我們看一下這個程序的邏輯結構,假如用戶輸入的是34981這個五位數,那么c=a=34981,從代碼2~19得知,此時的num=5,那么i從range(5)中取值,即循環5次。
第一次循環,n=c//10=34981//10=3498(這里要注意//的意思,表示整數除法,返回不大於結果的一個最大的整數),然后k=c-n*10=34981-3498*10=1,可以看出k就是個位數的數字1,然后c=n=3498。for循環進入第二次循環,n=c//10=3498//10=349,k=3498-349*10=8,而8就是十位數的數字,如此循環,直至循環結束。
當然實現第二個功能的代碼不止20~27行這一種,下面再看看幾種其他的代碼:
1 a *= 10
2 while(a//10) != 0: 3 a //= 10
4 print(a%10) 5 #第一行a=a*10,這行代碼考慮到了邊界問題。
6 #while判斷語句是a//10不等於0,這里說明a至少必須是個兩位數,那么如果輸入的是個個位數呢?如果是個位數的話,個位數整除10就是0,不會進入while循環。就算是多位數,比如兩位數整除10的話,肯定只會得到十位數,三位數的話只會得到百位和十位,沒有a *= 10,這段代碼就是有缺陷的。
7 #比如還是輸入的是34981,那么第一輪循環a=34981*10=349810,然后進入while循環,349810//10=34981,34981%10=1(這里注意%是取模運算取余數),得出個位數字1之后,a就變成了34981,然后34981//10=3498,3498對10取模為8,得出十位數字8……
1 for i in range(num): 2 print(a % 10) 3 a //= 10
4 #循環的范圍還是基於正整數的位數,這里num可以用len()獲取,num=len(a)。
5 #對10取模運算,每次運算都取余數,幾位數就循環幾次。
6 #例如輸入的還是34981,第一次循環34981對10取模運算,得出1,然后34981//10=3498,進入第二次循環,3498%10=8,然后3498//10=349……
7 #這個程序和上面的程序都用到了取余和取整的結合使用。
考慮一下,如果按照萬位、千位、百位、十位、各位的順序,該如何實現呢?
1 # noinspection PyInterpreter
2 while True: 3 a = input("Please enter a number: ") 4 a = int(a) 5 if (a >= 100000) | (a < 0): 6 print("請輸入一個不超過5位的正整數!") 7 else: 8 if a >= 1000: 9 if a >= 10000: 10 num = 5
11 else: 12 num = 4
13 else: 14 if a >= 100: 15 num = 3
16 elif a >= 10: 17 num = 2
18 else: 19 num = 1
20 print("這是一個" + str(num) + "位數!") 21 print("從萬位到個位的順序為:") 22 for i in range(num): 23 b = 10**(num-1) 24 print(a//b,end=' ') 25 num -= 1
26 a %= b 27 print('\n')
這里主要看的是如何實現從萬位到個位每位數字的順序排列,即從22~26行,因為要從萬位數開始排序,那么例如輸入的數字是34981,那么需要34981//10000=3得出萬位數字,然后怎么取千位的數字呢?34981除以10000之后剩下的余數是4981,那么我們可以采取取模運算,34981%10000=4981,至此,第一輪循環結束,第二輪4981需要整除1000,得到千位數字4……那么來看一下,每一次循環,被除數是從10000,1000,100……這個規律,也就是10的4次方,10的3次方,10的2次方……,而10的(num-1)次方恰恰滿足這個規律,因此程序中設定b=10**(num-1),要注意的是,每循環一次,10的次方都需要減1,即25行num -= 1。