例子:循環語句--給定一個不超過5位的正整數,判斷該數的位數,依次打印出個位、十位、百位、千位、萬位的數字。


需求:給定一個不超過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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM