最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python?如何求N的階乘

 更新時(shí)間:2022年05月13日 10:06:28   作者:好心boy  
這篇文章主要介紹了python?如何求N的階乘,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

求N的階乘

本題要求編寫程序,計(jì)算N的階乘。

輸入格式:

輸入在一行中給出一個(gè)正整數(shù) N。

輸出格式:

在一行中按照“product = F”的格式輸出階乘的值F,請(qǐng)注意等號(hào)的左右各有一個(gè)空格。題目保證計(jì)算結(jié)果不超過(guò)雙精度范圍。

輸入樣例:

5

輸出樣例:

product = 120

x = int(input())
a = 1
for i in range(1, x+1):
? ? a = a*i
print("product = %d" % float(a))

實(shí)現(xiàn)階乘的三種解法

問(wèn)題描述:

輸入一個(gè)正整數(shù)n,輸出n!的值。

其中n!=123*…*n。

算法描述:

n!可能很大,而計(jì)算機(jī)能表示的整數(shù)范圍有限,需要使用高精度計(jì)算的方法。使用一個(gè)數(shù)組A來(lái)表示一個(gè)大整數(shù)a,A[0]表示a的個(gè)位,A[1]表示a的十位,依次類推。

將a乘以一個(gè)整數(shù)k變?yōu)閷?shù)組A的每一個(gè)元素都乘以k,請(qǐng)注意處理相應(yīng)的進(jìn)位。

首先將a設(shè)為1,然后乘2,乘3,當(dāng)乘到n時(shí),即得到了n!的值。

輸入格式:

輸入包含一個(gè)正整數(shù)n,n<=1000。

輸出格式:

輸出n!的準(zhǔn)確值。

樣例輸入:

10

樣例輸出:

3628800

看到這題我首先想到的是兩種比較簡(jiǎn)單的解法,一是循環(huán),二是遞歸。

解法一:循環(huán)

n = int(input())
ns = 1
for i in range(1,n+1):
? ? ns = ns*i
print(ns)

思路比較簡(jiǎn)單,就是定義一個(gè)變量ns賦予一個(gè)初始值1,然后利用for循環(huán)直接累乘得到最終結(jié)果。

解法二:遞歸

def factorial(n):
? ? if n==1:
? ? ? ? return n
? ? else:
? ? ? ? return n*factorial(n-1)
n = int(input())
res = factorial(n)
print(res)

遞歸也比較好理解,當(dāng)n == 2,return 2 * 1;n == 3,return 3*(2 * 1);n==4,return 4*(3*(2*1))。以此類推,再將最終的結(jié)果賦予res將其打印即可。

這兩種方法都比較簡(jiǎn)單,但很顯然都不符合題目要求的 “使用一個(gè)數(shù)組A來(lái)表示一個(gè)大整數(shù)a,A[0]表示a的個(gè)位,A[1]表示a的十位”,所以我們要想辦法利用數(shù)組來(lái)得到n!的結(jié)果。

解法三:數(shù)組

n= int(input())
ns = [0 for i in range(10000) ]
length = 1
ns[0] = length = 1
if n>=2:
? ? for i in range(2,n+1):
? ? ? ? carry = 0
? ? ? ? for j in range(length):
? ? ? ? ? ? temp = ns[j] * i + carry
? ? ? ? ? ? carry = int(temp/10)
? ? ? ? ? ? ns[j] = temp % 10
? ? ? ? while carry>0:
? ? ? ? ? ? ns[length] += carry%10
? ? ? ? ? ? length+=1
? ? ? ? ? ? carry = int(carry/10)
while length>0:
? ? length -=1
? ? print(ns[length],end='')

接下來(lái)我講下思路:

首先定義一個(gè)ns數(shù)組用來(lái)存儲(chǔ)n!的各個(gè)位數(shù)上的數(shù)值,利用for循環(huán)給ns加入10000個(gè)0值,以方便后面直接根據(jù)index對(duì)數(shù)組進(jìn)行操作。

然后定義length作為 “數(shù)組的長(zhǎng)度”(有真實(shí)數(shù)值的而非自動(dòng)添加的0) 也即n!的結(jié)果的位數(shù)。

之后也必須用到for循環(huán)進(jìn)行累乘,但跟解法一的直接累乘不同,這里是乘數(shù)(即i)跟各個(gè)位上的數(shù)分別相乘,若結(jié)果大于等于10則carry>0即向前進(jìn)一位數(shù)值為carry,若j循環(huán)結(jié)束后carry>0則說(shuō)明需要在當(dāng)前ns的“長(zhǎng)度”上進(jìn)一位,所以length+1即位數(shù)+1,這里carry起的就是判斷是否進(jìn)位的作用,而length則代表著結(jié)果的位數(shù)??赡苓@么說(shuō)有些抽象,下面我們通過(guò)分解運(yùn)行過(guò)程來(lái)更直觀的闡述上面的想法。

例如我們現(xiàn)在需要求5!,分五步,即i循環(huán)5次:

①i=1

?? ?ns[0] = length =1 , carry = 0
?? ?∴j in range(1)

⑴ j=0

?? ?temp = ns[j] * i + carry = ns[0] * i + carry =1*1+0=1 ?# temp為第j位數(shù)與i相乘并加上j-1位數(shù)與i相乘后進(jìn)位的值的結(jié)果
?? ?carry = int(temp/10) = 1/10 = 0 ??? ?# carry=0所以不用進(jìn)位
?? ?ns[j] = temp % 10 即 ns[0] = 1 % 10 =1 ? #只取個(gè)位數(shù)值作為第j位的值

②i=2

?? ?ns[0] = 1, length =1 , carry = 0
?? ?∴j in range(1)

⑴ j=0

?? ?temp = ns[j] * i + carry = ns[0] * i + carry =1*2+0=2 ?# temp為第j位數(shù)與i相乘并加上j-1位數(shù)與i相乘后進(jìn)位的值的結(jié)果
?? ?carry = int(temp/10) = 2 / 10 = 0 ??? ?# carry=0所以不用進(jìn)位
?? ?ns[j] = temp % 10 即 ns[0] = 2 % 10 =2 ? #只取個(gè)位數(shù)值作為第j位的值
?? ?#這樣就已經(jīng)的到2!的值了即2

③i=3

?? ?ns[0] = 2, length =1 , carry = 0
?? ?∴j in range(1)

⑴ j=0

?? ?temp = ns[j] * i + carry = ns[0] * i + carry =2*3+0=6 ?# temp為第j位數(shù)與i相乘并加上j-1位數(shù)與i相乘后進(jìn)位的值的結(jié)果
?? ?carry = int(temp/10) = 6 / 10 = 0 ??? ?# carry=0所以不用進(jìn)位
?? ?ns[j] = temp % 10 即 ns[0] = 6 % 10 =6 ? #只取個(gè)位數(shù)值作為第j位的值
?? ?#這樣就已經(jīng)的到3!的值了即6

④i=4

?? ?ns[0] = 6, length =1 , carry = 0
?? ?∴j in range(1)

⑴ j=0

?? ?temp = ns[j] * i + carry = ns[0] * i + carry =6*4+0=24 ?# temp為第j位數(shù)與i相乘并加上j-1位數(shù)與i相乘后進(jìn)位的值的結(jié)果
?? ?carry = int(temp/10) = 24 / 10 = 2 ??? ?# carry=2>0所以需要向前進(jìn)2
?? ?ns[j] = temp % 10 即 ns[0] = 24 % 10 =4 ? #只取個(gè)位數(shù)值作為第j位的值

j循環(huán)結(jié)束,carry>0執(zhí)行while循環(huán)

?? ?while carry>0:?? ??? ?
?? ??? ? ? ?ns[length] += carry%10 即 ns[1] += 2 % 10 = 2 ?#carry = 2 所以向前進(jìn)2
? ? ? ? ? ? length+=1 即 length =1+1=2 #位數(shù)加一
? ? ? ? ? ? carry = int(carry/10) = 2 / 10 = 0 # carry = 2<10所以不需要繼續(xù)進(jìn)位,while循環(huán)結(jié)束
? ? ? ? ? ? ∴l(xiāng)ength = 2 , ns[0] = 4 ,ns[1] = 2
? ? #這樣就得到4!的值ns[1]*10+ns[0] 即 24,輸出時(shí)可直接倒著打印然后end=''而不需要每位數(shù)乘10*n再相加

⑤i=5

? ? ns[0] = 4, ns[1] = 2 length =2 , carry = 0
?? ?∴j in range(2)

⑴ j=0

?? ?temp = ns[j] * i + carry = ns[0] * i + carry =4*5+0=20 ?# temp為第j位數(shù)與i相乘并加上j-1位數(shù)與i相乘后進(jìn)位的值的結(jié)果
?? ?carry = int(temp/10) = 20 / 10 = 2 ??? ?# carry=2>0所以需要向前進(jìn)2
?? ?ns[j] = temp % 10 即 ns[0] = 20 % 10 =0 ? #只取個(gè)位數(shù)值作為第j位的值

⑵ j=1

? ? temp = ns[j] * i + carry = ns[1] * i + carry =2*5+2=12 ?# temp為第j位數(shù)與i相乘并加上j-1位數(shù)與i相乘后進(jìn)位的值的結(jié)果
?? ?carry = int(temp/10) = 12 / 10 = 1 ??? ?# carry=1>0所以需要向前進(jìn)1
?? ?ns[j] = temp % 10 即 ns[1] = 12 % 10 =2 ? #只取個(gè)位數(shù)值作為第j位的值

j循環(huán)結(jié)束,carry>0執(zhí)行while循環(huán)

?? ?while carry>0:?? ??? ?
?? ??? ? ? ?ns[length] += carry%10 即 ns[2] += 1 % 10 = 1 ?#carry = 1 所以向前進(jìn)2
? ? ? ? ? ? length+=1 即 length =2 +1 = 3 #位數(shù)加一
? ? ? ? ? ? carry = int(carry/10) = 1 / 10 = 0 # carry = 1<10所以不需要繼續(xù)進(jìn)位,while循環(huán)結(jié)束
? ? ? ? ? ? ∴l(xiāng)ength = 3 , ns[0] = 0 , ns[1] = 2 , ns[2] = 1
? ? # 這樣就得到5!的值ns[2] ns[1] ns[0]即 120

這樣看下來(lái)是否發(fā)現(xiàn)和小學(xué)的時(shí)候?qū)W的豎式乘法運(yùn)算過(guò)程很相似,從低位數(shù)到高位數(shù)(ns[j],j in range(0,length))依次與乘數(shù)(i)相乘,大于十則進(jìn)位(carry=temp/10>0,若ns[length]*i+carry > 10則length+1)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到excel的示例--普通格式

    python實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到excel的示例--普通格式

    今天小編就為大家分享一篇python實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到excel的示例--普通格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Django框架模板注入操作示例【變量傳遞到模板】

    Django框架模板注入操作示例【變量傳遞到模板】

    這篇文章主要介紹了Django框架模板注入操作,結(jié)合實(shí)例形式分析了Django框架變量傳遞到模板簡(jiǎn)單操作技巧,需要的朋友可以參考下
    2018-12-12
  • OpenCV圖像處理之七種常用圖像幾何變換

    OpenCV圖像處理之七種常用圖像幾何變換

    這篇文章主要介紹了OpenCV圖像處理中常用的幾個(gè)圖像幾何變換:裁剪、放大、縮小、平移、錯(cuò)切、鏡像、旋轉(zhuǎn)、透視等。文中示例代碼非常詳細(xì),需要的朋友可以參考一下
    2021-12-12
  • 詳解python中requirements.txt的一切

    詳解python中requirements.txt的一切

    最近學(xué)習(xí)到了python中的requirements.txt,或許是因?yàn)樘?jiǎn)單了,網(wǎng)上沒(méi)有搜到比較完整的介紹,所以這篇文章主要介紹了關(guān)于python中requirements.txt的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-03-03
  • Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法

    Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法

    今天小編就為大家分享一篇Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 淺談Python3中strip()、lstrip()、rstrip()用法詳解

    淺談Python3中strip()、lstrip()、rstrip()用法詳解

    這篇文章主要介紹了淺談Python3中strip()、lstrip()、rstrip()用法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • python3中利用filter函數(shù)輸出小于某個(gè)數(shù)的所有回文數(shù)實(shí)例

    python3中利用filter函數(shù)輸出小于某個(gè)數(shù)的所有回文數(shù)實(shí)例

    今天小編就為大家分享一篇 python3中利用filter函數(shù)輸出小于某個(gè)數(shù)的所有回文數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Python中HTTP請(qǐng)求的全面指南

    Python中HTTP請(qǐng)求的全面指南

    在現(xiàn)代網(wǎng)絡(luò)應(yīng)用中,HTTP(HyperText Transfer Protocol)協(xié)議是客戶端與服務(wù)器之間數(shù)據(jù)傳輸?shù)暮诵?本文都將從基礎(chǔ)到高級(jí),逐步引導(dǎo)你成為HTTP請(qǐng)求處理的高手,快跟隨小編一起學(xué)習(xí)起來(lái)吧
    2024-10-10
  • python定時(shí)任務(wù)apscheduler的詳細(xì)使用教程

    python定時(shí)任務(wù)apscheduler的詳細(xì)使用教程

    APScheduler的全稱是Advanced?Python?Scheduler,它是一個(gè)輕量級(jí)的?Python定時(shí)任務(wù)調(diào)度框架,下面這篇文章主要給大家介紹了關(guān)于python定時(shí)任務(wù)apscheduler的詳細(xì)使用教程,需要的朋友可以參考下
    2022-02-02
  • python檢測(cè)服務(wù)器端口代碼實(shí)例

    python檢測(cè)服務(wù)器端口代碼實(shí)例

    這篇文章主要介紹了python檢測(cè)服務(wù)器端口代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評(píng)論

施秉县| 崇文区| 平利县| 垦利县| 中江县| 旺苍县| 长宁区| 河南省| 东阳市| 九龙坡区| 宣武区| 南涧| 拉孜县| 彭泽县| 吕梁市| 宕昌县| 黑水县| 利津县| 东阿县| 乐清市| 股票| 金塔县| 和政县| 阳春市| 五寨县| 南昌市| 获嘉县| 宿松县| 南岸区| 海林市| 建昌县| 洛阳市| 襄城县| 孟州市| 顺昌县| 西林县| 重庆市| 吉林省| 荆州市| 中牟县| 普陀区|