Python真題案例之小學(xué)算術(shù)?階乘精確值?孿生素?cái)?shù)?6174問(wèn)題詳解
前言
今天給大家分享一下刷到的關(guān)于數(shù)值處理的算法題。雖然題目比較簡(jiǎn)單但是問(wèn)題的處理方式值得我們學(xué)習(xí)。小學(xué)生算術(shù)涉及到加法進(jìn)位、階乘精確值用于計(jì)算一個(gè)結(jié)果為很長(zhǎng)的數(shù)、孿生素?cái)?shù)是計(jì)算兩個(gè)相鄰的素?cái)?shù)(比較簡(jiǎn)單)、6174問(wèn)題按照題目進(jìn)行模擬就可以。
小學(xué)生算術(shù)
問(wèn)題描述
最近很多小學(xué)生迎來(lái)了快學(xué)第一考,在進(jìn)行加法進(jìn)位的時(shí)候可把小學(xué)生難為壞了 因?yàn)檫M(jìn)位的時(shí)候稍不注意就會(huì)算錯(cuò)。請(qǐng)你設(shè)計(jì)一個(gè)程序,實(shí)現(xiàn)計(jì)算兩位數(shù)相加的時(shí)候需要 進(jìn)行多少次進(jìn)位,以供小學(xué)生檢驗(yàn)自己是否正確的進(jìn)位。(以0 0 結(jié)尾)
樣例輸入:
123 456
555 555
123 594
0 0
樣例輸出:
0
3
1
問(wèn)題分析
可以設(shè)置一個(gè)標(biāo)志位在進(jìn)行計(jì)算的時(shí)候判斷兩個(gè)數(shù)是否需要進(jìn)位, 如果進(jìn)位了就將進(jìn)位的標(biāo)志位數(shù)值設(shè)為1,不進(jìn)就將標(biāo)志位數(shù)值設(shè)為0,因?yàn)樵诩臃ㄟ\(yùn)算中進(jìn)位最多進(jìn)1。9+9=18,將8留下來(lái)將1進(jìn)向更高位參與運(yùn)算
代碼實(shí)現(xiàn)
老規(guī)矩先上運(yùn)行結(jié)果:
再上代碼:
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經(jīng)過(guò)變換有一個(gè)為0那么循環(huán)就終止 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)
階乘精確值
問(wèn)題描述
眾所周知,Python數(shù)值型的位數(shù)與電腦內(nèi)存有關(guān)??梢院茌p松實(shí)現(xiàn)n的階乘 ,但是對(duì)于C、C++而言整型的位數(shù)是有一定長(zhǎng)度的。超過(guò)一定長(zhǎng)度就會(huì)溢出,輸入不超過(guò)1000的正整數(shù)n,輸出n!=1234…*n的精確結(jié)果。
樣例輸入:
30
樣例輸出:
265252859812191058636308480000000
問(wèn)題分析
很長(zhǎng)很長(zhǎng)的計(jì)算結(jié)果對(duì)于Python語(yǔ)言而言不會(huì)有太大影響,因?yàn)镻yhton會(huì)根據(jù)電腦內(nèi)存的大小決定整型的大小。而對(duì)于C\C++這樣的語(yǔ)言而言,數(shù)值型都有一定的長(zhǎng)度。超過(guò)一定長(zhǎng)度發(fā)生溢出之后將會(huì)影響最終的結(jié)果。這一個(gè)題目我們需要使用數(shù)組進(jìn)行計(jì)算結(jié)果的存儲(chǔ),然后自己模擬乘法運(yùn)算。最終得到計(jì)算結(jié)果。
代碼實(shí)現(xiàn)
老規(guī)矩先上運(yùn)行結(jié)果:
上代碼: 在這里使用了兩種方式,一種是直接計(jì)算,另一種就是使用C語(yǔ)言風(fēng)格進(jìn)行模擬乘法。 由于Python內(nèi)置模塊較為強(qiáng)大直接計(jì)算超級(jí)方便還可以計(jì)算出很長(zhǎng)的數(shù),只需要很少的時(shí)間 (如下圖)但是我們今天為自己找事情做,就使用Pyhton語(yǔ)言模擬一下C語(yǔ)言的寫(xiě)法。
即便計(jì)算10000的階乘花費(fèi)的時(shí)間依舊不到秒
import time def timmer(func): def weapper(*s): start=time.time() func(*s) end=time.time() print("用時(shí):",end-start) return weapper @timmer def f1(n): # 直接計(jì)算 ans=1 # 用于標(biāo)記現(xiàn)在是所在的位數(shù) 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語(yǔ)言方法精確計(jì)算 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)
孿生素?cái)?shù)
問(wèn)題描述
素?cái)?shù)又稱質(zhì)數(shù),他是只能被1與他本身整除的整數(shù),并且大于1現(xiàn)給出一個(gè)數(shù),比他小的孿生素?cái)?shù) 孿生素?cái)?shù)的意思就是連續(xù)挨著的兩個(gè)素?cái)?shù),并且他的的差為2(即 n與n-2) 現(xiàn)在給出一個(gè)正整數(shù),請(qǐng)計(jì)算出比他小但是距離他最近的兩個(gè)孿生素?cái)?shù)。
樣例輸入:
1000
樣例輸出:
881 883
問(wèn)題分析
判斷是不是孿生素?cái)?shù),首先要確定是不是素?cái)?shù)。是的話再判斷與其相差2的數(shù)是不是素?cái)?shù)。 如果兩個(gè)都是的話直接進(jìn)行輸出,否則繼續(xù)判斷。
代碼實(shí)現(xiàn)
老規(guī)矩先上運(yùn)行結(jié)果:
上代碼:
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問(wèn)題
問(wèn)題描述
假設(shè)你有各位數(shù)字互不相同的四位數(shù)。將該數(shù)中的數(shù)字從大到小排序后得到a 從小到大排序后得到b,然后使用a-b得到的結(jié)果取代原來(lái)的數(shù)。并繼續(xù)相同的操作。 任務(wù):輸入一個(gè)數(shù)n輸出操作序列。直到出現(xiàn)循環(huán),比如排序前的6174生成的結(jié)果也是6174
樣例輸入:
1234
樣例輸出:
1234—>3087—>8352—>6174—>6174
問(wèn)題分析
涉及到對(duì)數(shù)值中的數(shù)字進(jìn)行排序
排序完后使用大的減去小的,然后對(duì)比生成的結(jié)果與原來(lái)的數(shù)。
代碼實(shí)現(xiàn)
老規(guī)矩先上運(yùn)行結(jié)果:
上代碼:
# 自定義排序函數(shù),如果r=True就是降序 def msort(n,r=True): ans=0 temp=[] //將數(shù)值轉(zhuǎn)換為列表 while n: temp.append(n%10) n//=10 #在剛剛進(jìn)行排序的時(shí)候高位與低位進(jìn)行了顛倒,再顛倒回來(lái) temp=temp[::-1] #排序 temp=sorted(temp,reverse=r) # 將列表組合成數(shù)值并返回出去 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="")
這就是今天分享的全部?jī)?nèi)容啦!實(shí)現(xiàn)并不難但是思想非常的重要。希望大家能熟練掌握。
???? ? ???? ??????•??•?? ??????????????????
到此這篇關(guān)于Python真題案例之小學(xué)算術(shù) 階乘精確值 孿生素?cái)?shù) 6174問(wèn)題詳解的文章就介紹到這了,更多相關(guān)Python 階乘精確值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文教會(huì)你用nginx+uwsgi部署自己的django項(xiàng)目
uWSGI是一個(gè)Web服務(wù)器,它實(shí)現(xiàn)了WSGI協(xié)議、uwsgi、http等協(xié)議,下面這篇文章主要給大家介紹了關(guān)于用nginx+uwsgi部署自己的django項(xiàng)目的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Python實(shí)現(xiàn)腳本轉(zhuǎn)換為命令行程序
使用Python中的scaffold和click庫(kù),你可以將一個(gè)簡(jiǎn)單的實(shí)用程序升級(jí)為一個(gè)成熟的命令行界面工具,本文就來(lái)帶你看看具體實(shí)現(xiàn)方法,感興趣的可以了解下2022-09-09淺談Python 命令行參數(shù)argparse寫(xiě)入圖片路徑操作
這篇文章主要介紹了淺談Python 命令行參數(shù)argparse寫(xiě)入圖片路徑操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07python中pandas.DataFrame的簡(jiǎn)單操作方法(創(chuàng)建、索引、增添與刪除)
這篇文章主要介紹了python中pandas.DataFrame的簡(jiǎn)單操作方法,其中包括創(chuàng)建、索引、增添與刪除等的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-03-03Python3列表內(nèi)置方法大全及示例代碼小結(jié)
這篇文章主要介紹了Python3列表內(nèi)置方法大全及示例代碼小結(jié),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05PyQt5實(shí)現(xiàn)界面(頁(yè)面)跳轉(zhuǎn)的示例代碼
這篇文章主要介紹了PyQt5實(shí)現(xiàn)界面跳轉(zhuǎn)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Python使用uuid庫(kù)生成唯一標(biāo)識(shí)ID
這篇文章主要介紹了Python使用uuid模塊生成唯一標(biāo)識(shí)ID,需要的朋友可以參考下2020-02-02python使用json序列化datetime類型實(shí)例解析
這篇文章主要介紹了python使用json序列化datetime類型實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Python遍歷文件夾和讀寫(xiě)文件的實(shí)現(xiàn)代碼
這篇文章主要介紹了Python遍歷文件夾和讀寫(xiě)文件的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-08-08