Python真題案例之小學算術 階乘精確值 孿生素數 6174問題詳解
前言
今天給大傢分享一下刷到的關於數值處理的算法題。雖然題目比較簡單但是問題的處理方式值得我們學習。小學生算術涉及到加法進位、階乘精確值用於計算一個結果為很長的數、孿生素數是計算兩個相鄰的素數(比較簡單)、6174問題按照題目進行模擬就可以。
小學生算術
問題描述
最近很多小學生迎來瞭快學第一考,在進行加法進位的時候可把小學生難為壞瞭 因為進位的時候稍不註意就會算錯。請你設計一個程序,實現計算兩位數相加的時候需要 進行多少次進位,以供小學生檢驗自己是否正確的進位。(以0 0 結尾)
樣例輸入:
123 456
555 555
123 594
0 0
樣例輸出:
0
3
1
問題分析
可以設置一個標志位在進行計算的時候判斷兩個數是否需要進位, 如果進位瞭就將進位的標志位數值設為1,不進就將標志位數值設為0,因為在加法運算中進位最多進1。9+9=18,將8留下來將1進向更高位參與運算
代碼實現
老規矩先上運行結果:
再上代碼:
import sys flag=0 lis=[] num=0 while True: m,n=sys.stdin.readline().strip().split() m,n=int(m),int(n) if n==m==0: break # 隻要m,n經過變換有一個為0那麼循環就終止 while m and n: if (m%10+n%10+flag)>=10: num+=1 flag=1 else: flag=0 m//=10 n//=10 lis.append(num) num=0 for i in lis: print(i)
階乘精確值
問題描述
眾所周知,Python數值型的位數與電腦內存有關。可以很輕松實現n的階乘 ,但是對於C、C++而言整型的位數是有一定長度的。超過一定長度就會溢出,輸入不超過1000的正整數n,輸出n!=1234…*n的精確結果。
樣例輸入:
30
樣例輸出:
265252859812191058636308480000000
問題分析
很長很長的計算結果對於Python語言而言不會有太大影響,因為Pyhton會根據電腦內存的大小決定整型的大小。而對於C\C++這樣的語言而言,數值型都有一定的長度。超過一定長度發生溢出之後將會影響最終的結果。這一個題目我們需要使用數組進行計算結果的存儲,然後自己模擬乘法運算。最終得到計算結果。
代碼實現
老規矩先上運行結果:
上代碼: 在這裡使用瞭兩種方式,一種是直接計算,另一種就是使用C語言風格進行模擬乘法。 由於Python內置模塊較為強大直接計算超級方便還可以計算出很長的數,隻需要很少的時間 (如下圖)但是我們今天為自己找事情做,就使用Pyhton語言模擬一下C語言的寫法。
即便計算10000的階乘花費的時間依舊不到秒
import time def timmer(func): def weapper(*s): start=time.time() func(*s) end=time.time() print("用時:",end-start) return weapper @timmer def f1(n): # 直接計算 ans=1 # 用於標記現在是所在的位數 if n==0 or n==1: print(1) exit() else: for i in range(2,n+1): ans=ans*i print(ans) @timmer def f2(n): # C語言方法精確計算 ans=[0]*1000 ans[0]=1 for i in range(2,n+1): j=0 c=0 while j<1000: temp=ans[j]*i+c ans[j]=temp%10 c=temp//10 j+=1 i=len(ans)-1 flag=True while i>=0: if flag and ans[i]==0: pass else: print(ans[i],end="") flag=False i-=1 print() if __name__=="__main__": n=int(input()) # f1(n) f2(n)
孿生素數
問題描述
素數又稱質數,他是隻能被1與他本身整除的整數,並且大於1現給出一個數,比他小的孿生素數 孿生素數的意思就是連續挨著的兩個素數,並且他的的差為2(即 n與n-2) 現在給出一個正整數,請計算出比他小但是距離他最近的兩個孿生素數。
樣例輸入:
1000
樣例輸出:
881 883
問題分析
判斷是不是孿生素數,首先要確定是不是素數。是的話再判斷與其相差2的數是不是素數。 如果兩個都是的話直接進行輸出,否則繼續判斷。
代碼實現
老規矩先上運行結果:
上代碼:
def is_ok(num): if num==1: return False for i in range(2,int(math.sqrt(num))+1): if num%i==0: return False return True n=int(input()) while n: if is_ok(n) and is_ok(n-2): print(n-2,n) break n-=1
6174問題
問題描述
假設你有各位數字互不相同的四位數。將該數中的數字從大到小排序後得到a 從小到大排序後得到b,然後使用a-b得到的結果取代原來的數。並繼續相同的操作。 任務:輸入一個數n輸出操作序列。直到出現循環,比如排序前的6174生成的結果也是6174
樣例輸入:
1234
樣例輸出:
1234—>3087—>8352—>6174—>6174
問題分析
涉及到對數值中的數字進行排序
排序完後使用大的減去小的,然後對比生成的結果與原來的數。
代碼實現
老規矩先上運行結果:
上代碼:
# 自定義排序函數,如果r=True就是降序 def msort(n,r=True): ans=0 temp=[] //將數值轉換為列表 while n: temp.append(n%10) n//=10 #在剛剛進行排序的時候高位與低位進行瞭顛倒,再顛倒回來 temp=temp[::-1] #排序 temp=sorted(temp,reverse=r) # 將列表組合成數值並返回出去 for i in temp: ans=ans*10+i return ans ans=[] n=int(input()) ans.append(n) while True: # 得到最大最小值 maxn=msort(n) minn=msort(n,False) temp=maxn-minn ans.append(temp) if n==temp: break n=temp flag=True for i in ans: if flag: print(i,end="") flag=False else: print("--->",i,end="",sep="")
這就是今天分享的全部內容啦!實現並不難但是思想非常的重要。希望大傢能熟練掌握。
ᴴᴬᵛᴱ ᴬ ᴳᴼᴼᴰ ᵀᴵᴹᴱฅʕ•̫͡•ʔฅ 🕺🏿🕺🏿⚰️🕺🏿🕺🏿
到此這篇關於Python真題案例之小學算術 階乘精確值 孿生素數 6174問題詳解的文章就介紹到這瞭,更多相關Python 階乘精確值內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python真題案例之蛇形數組詳解
- Python 常用的print輸出函數和input輸入函數
- Python全棧之進程和守護進程
- python 多線程與多進程效率測試
- Python中的變量、運算符與流程控制