歐拉項目第23題-非豐富數和

2021-01-11 每日編程練習

問題描述

第23題圖

這個問題翻譯為中文就是:

如果一個數等於它的因數之和,那這個數就叫完美數,如28=1+2+4+7+14,如果它的因數之和小於這個數,那這個數叫做匱乏數,反之如果因數之和大於這個數,則成為豐富數12是最小的豐富數,12 < 1+2+3+4+6,24是能被表示為2個豐富數之和的數中最小的那個,通過數學分析,所有比28123大的數都可以寫成2個豐富數之和求解:找到所有的不可以表示為2個豐富數之和的數,返回它們的和

解題思路

這題關鍵是要讀懂題意,超過28123的數都不符合條件,所以可能的數必然在[1, 28123]之間,按理來說這是一個很小的區間,不管用什麼算法肯定都很快算出答案

今天上班摸魚的時候做的這題,一開始以為很簡單暴力可破,但是後來發現程序如果不經優化可以很慢,我經歷了運行時間由10分鐘到30秒到低於1s的過程,挺有意思的

rust語言實現

pubfnsolution()-> usize {

letmut abundant_arr =vec![];

let threshold =28123;

for i in12..=threshold {

ifis_abundant(i){

abundant_arr.push(i);

}

}

let abundant_arr_len = abundant_arr.len();

letmut target_arr: Vec<usize>=(0..=threshold).collect();// 優化點1

for i in0..abundant_arr_len {

for j in i..abundant_arr_len {// 優化點4

let s = abundant_arr[i]+ abundant_arr[j];

if s <= threshold {

target_arr[s]=0;// 優化點2

}

}

}

return target_arr.iter().sum();

}

fnis_abundant(num: usize)-> bool {

letmut divisor_sum =1;

let mid =(num as f64).sqrt()as usize +1;// 優化點3

for i in2..mid+1{

if num % i ==0{

let q = num / i;

if i < q {

divisor_sum += i;

divisor_sum += q;

}

if i == q {

divisor_sum += i;

}

}

}

if divisor_sum > num {

returntrue;

}

returnfalse;

}

#[cfg(test)]

mod tests {

usesuper::*;

#[test]

fntest_is_abundant(){

for i in1..12{

assert_eq!(false,is_abundant(i));

}

assert_eq!(true,is_abundant(12));

assert_eq!(false,is_abundant(13));

assert_eq!(false,is_abundant(16));

assert_eq!(true,is_abundant(4088));

assert_eq!(true,is_abundant(20));

assert_eq!(false,is_abundant(28));// 28 is perfect number, so not abundant number

}

#[test]

fntest_solution(){

assert_eq!(4179871,solution());

}

}

代碼解釋

基本思路是先把[12, 28123]之間的豐富數都提取出來存放到一個數組中,大概有6000多個這樣的數,遍歷2遍這個數組,找出能表示為2個豐富數之和的數剔除出來,剩下的就是不能被表示的,然後求和就行了。代碼後面按照慣例包含單測和功能測試

有幾個優化點需要注意:

1. 通過迭代器快速生成數組,性能遠遠好於循環插入

2. 剔除元素時直接把數組對應位置標記為0,性能遠遠好於remove或者find之後刪除等方法,數組直接讀寫是常數時間,而查找最快也要 O(nlgn)

3. 算一個數的所有因數時,不需要遍歷這個數以內的所有數,到平方根處就行,能很大的減少不必要的計算量

4. 兩次遍歷數組時,j從i處開始就行,避免重複計算,而且i、j是可以相等的

做完之後發現論壇上很多大神分享了各種稀奇古怪的解法,有興趣的小夥伴可以去參考下

相關焦點

  • 歐拉公式怎麼寫_歐拉公式的意義
    歐拉公式將指數函數的定義域擴大到了複數域,建立和三角函數和指數函數的關係,被譽為「數學中的天橋」形式簡單,結果驚人,歐拉本人都把這個公式刻在皇家科學院的大門上,看來必須好好推敲一番。
  • 史上最簡單的歐拉題
    這個數的結果為1000368199144695177095375011227646795567793680622934654583760988100234910747716194381428659099527845945869942643191290894720342979906407679647259860434238468038326040809691037615370376237713648510063115732951461774246705584266865759601815843666442832284556880313114548151539190975398485496645576513465858582712336401166221956188173449531674102688908321764663020306699770408625340766091595022791379368098369306375602813856646358773751558775213460225796579846583334007349358624342339332981334571237888809283103348760261360175950815609179464026871005243652109980863552142014242903434068560936573231079342194031864413918101238151056509267393515760392842472501391594073463001521843811073767021711026307504695733467897821866906648469828346607412967395801797791683609834722432241952845352564681868240369569566192825555323558078061997527689983848863374786789331581565252059172614339424600986143259233167583371070362625554531852054166117148858229508581589614337594463277554380518380921301218836327102231407332201109740102580216469298331766920619646083790732807627360614428085171565006289728508688964226799647192582924058589530750674578385365561878559589685756225692348914746922810913915619834754117648358035814128670294158565669942087736286390942241547226015004471330630113072042704288905042142628193771918594574302202147201188486345913190833752307476966010547423928871063118783026036381319039052008252072057933666712918946233312793697094074224187872045970976444309242782187738320257490080824330074991698698239561125811127607863900355221737846690567707344074494145266662103839812840216303448476913957072355732716627098372245223046792919747259113157425824064858331415400943278213042954635053574045209984512221264241903550178416824551412548637590007779082539288247751653566899882749594405895102587985539527709493510049546445427265617478399107188238681771215904234119392247489751079085948055945098805617963722928469554263782217625160428008228845552540344494860195267115187092227766195753907211126646150140614744233974765273475619964311852858614167819668340124730487710162006793529985758820653677274379563313495454526632718723482339494825759821076401694316043456512117937935456463521463021197726694983558929132357576188594977516630734212863869456164205525536767311298137182511494649463663073759219213056823561667776093739425742883930712609962163464088038826569132032160692637206183085942987973684584276491784843115472077900401692595694119273553511025991265446039366288921743581333200083717105241171504606883543418862024047552177055263424469501298905901938158245938633694105024815166679813689156668341197713475094389904887126794468901893850475050011205225742455555625750560213230387910337983950333245020653238989115507013882956277763880795687210857196493893142656713105966275422144605988058939600603604226921401402096519294250488670297983396353279460453142375542267881989197481789780678955093763193658603690898474826976906544473978017455720367929981796023041785852626797271283465789498383642350667978127819110846700
  • 豐富的圖形世界知識點+練習題分享,研究透每個題考試才可得高分
    豐富的圖形世界知識點+練習題分享,研究透每個題考試才可得高分初中數學豐富的圖形世界考查的是同學們的空間想像能力,是考查了同學的觀察和想像能力,是很重要的一部分知識,接下來老師來分享一下豐富的圖形世界知識點+練習題,值得學生動手去做。
  • 這道題來頭不小,改編自一道國際智力名題,還曾驚動了數學家歐拉
    唯獨歐拉似乎並沒有什麼故事讓我們熟知,然而,歐拉卻是歷史上最為多產的數學家。其在數學、力學上的成就讓人嘆為觀止。其實,並不是說在歐拉的身上就沒有故事,只是有些小故事並不是人知而已。今天,小磊要和大家分享的這道數學題,其實是改編自一道國際智力名題,而這道國際智力名題,就曾驚動了當時的大數學家歐拉先生。話不多說,讓我們先看看這道題吧。
  • 七歲兒童的數學:圖形著色,色彩數,歐拉路徑和歐拉環
    地圖著色、歐拉路徑和環。 目標是用最少的顏色種類,圖形的色彩數是能夠滿足著色的最少顏色個數。小姑娘們給圖形著色,並數出他們使用的顏色個數,我們還針對圖形進行分組討論,為什麼她需要用到這些顏色。接著,我們考慮歐拉路徑和環,在這種特殊的圖形中一筆即可畫下所有的邊,並且每條邊只經過一次。我們從一些簡單的例子開始,然後考慮一些複雜點的情況。
  • 歐拉函數和費馬小定理
    到了1736年,歐拉給出了費馬小定理的嚴格證明。而到了1760年,歐拉又給出了費馬小定理的重要推廣。他首先考慮了小於給定正整數n且與n互素的正整數個數,高斯為此專門引入了一個記號Φ(n),稱之為歐拉函數。使用這個新的函數,歐拉證明了如果a和n互素,則n整除a^Φ(n)-1。
  • 趙金昊解析「歐拉幻方」,內涵《大腦7》的題目簡單和賽制問題
    第七季被網友吐槽最多的便是題目和賽制問題,這兩個問題可以說從第一期伴隨了整季,直到收官仍然存在這樣的問題。所有選手對最後一期的「歐拉幻方」都表示非常難,從道具陣容和題目難度來看,甚至有觀眾拿這個項目媲美前幾季的項目,然而,真的有可比性嗎?
  • 從2017談歐拉函數
    又如,2017是滿足下式 φ(n) = φ(n-1) + φ(n-2)的n,其中φ常被為歐拉函數:對正整數n,歐拉函數是小於等於n的數中與n互質的數的數目。在數論中,如果兩個或兩個以上的整數的最大公約數是 1,則稱它們為互質。
  • 歐拉恆等式
    建議您一定直接關注本公眾號(sx100sy),這樣有什麼問題可以留言交流和發消息,我會誠懇回復。未經授權而轉載我文章的地方丟失了很多功能,比如留言,比如發消息到我後臺。本公眾號才是良好的交流平臺和文明的生態環境。偉大的數學家歐拉的名字總是離不開我的視野。今天介紹一個恆等式,又是以他的名字命名的。它的一邊是一個無窮乘積(用「∏」表示),另一邊則是一個無窮級數(用「∑」表示)。完全不同的兩種運算竟然相等!很神奇。這個恆等式就是它是偉大的歐拉發現的,所以現在被我們稱作歐拉恆等式。
  • 趣味數學100題 第23題:雞兔問題(六)
    趣味數學100題 第二期第22題答案:解:經過仔細觀察、比較,可以發現,此題也可以歸為「雞兔問題
  • 歐拉旅行 2016自駕遊大會創業項目秀
    圍繞行、遊、住自駕用戶三大剛需,創業項目層出不窮。愛駕傳媒攜手飛馬旅招募精選行、遊、住三大領域各一個優質創業項目,由飛馬旅CEO錢倩主持,3月6日在2016自駕遊大會舞臺上做創業項目電梯演講,現場與7位評委交流過招。
  • 讀讀歐拉,他是所有人的老師
    歐拉示性數溯源於歐拉提出的凸多面體的一條定理:在一凸多面體中,頂點數-稜邊數+面數=2    歐拉13歲上大學時,約翰·伯努利已經是歐洲很有名的數學家,伯努利後來對歐拉說,「我介紹高等分析的時候,它還是個孩子,而你正在將它帶大成人。」    全才數學家    李文林說:「除了分析,很多數學領域都繞不開歐拉的名字。如數論,高斯說數學是科學的皇后,而數論是數學的皇后,其難度和地位可想而知。」
  • 歐拉公式的證明_歐拉公式推導過程
    在任何一個規則球面地圖上,用 R記區域個 數 ,V記頂點個數 ,E記邊界個數,則 R+ V- E= 2,這就是歐拉定理,它於1640年由Descartes首先給出證明 ,後來 Euler(歐拉)於1752年又獨立地給出證明,我們稱其為歐拉定理,在國外也有人稱其為Descartes定理。
  • 數學大師啟示錄——歐拉
    下面就是其中的一個:&34;一道初等代數的簡單應用題,經過歐拉精心編寫,大大激發起孩子們的學習興趣。但是,最受孩子們歡迎的還是他那講不完的故事和詩朗誦;而如果他得閒能和孩子們在一起唱歌遊戲,消磨一個愉快的晚上,更使他們久久難忘。
  • 蘇格拉底和歐拉有話說
    資金充足,藏書豐富,重視研究,沒啥教學負擔,有充分的時間及自由探究科學問題。後來愛因斯坦終老一生的普林斯頓高級研究所有點山寨俄羅斯科學院的意思。約翰·伯努利的兩個兒子數學家丹尼爾·伯努利和尼古拉二世·伯努利都已經在此混了一段時間,尤其是歐拉的髮小兼死黨丹尼爾·伯努利,作為伯努利家族代表人物之一,混得風生水起,竟然身兼數學所,物理學所和生理學所的若干重要職位,覺得忙不過來了,他推薦歐拉來接替他自己在生理學所的職位。為什麼是生理學所?只能說天才跨界總是比我等凡人容易多了。
  • 數學裡最美的恆等式——歐拉恆等式
    比較公認的觀點是著名的歐拉恆等式e^(iπ)+1=0,因為這個公式精簡卻無比美妙。e、i、π、1、0不正是數學中最常見、最重要的五個常數嗎?萊昂哈德·歐拉是18世紀最偉大的數學家之一,也是人類歷史上最傑出的數學家之一。作為一個多產的數學家,歐拉貢獻不可估量,他提出了許多對現代數學不可或缺的概念。在歐拉的一生中,它出版了885份關於關於數學和其他學科的論文和書籍。
  • 【數學遊戲】數獨 第2題
    「數獨」跨越了文字和文化的疆域,被譽為一種全球化時代的益智遊戲。每通過一道「數獨」關,都是一次精彩的腦力探險!(要想深入了解數獨,請耐心往下閱讀)第1題答案:第2題:(答案明天見!)但這一概念最初並非來自日本,而是源自拉丁方塊,它是十八世紀的瑞士數學家歐拉發明的。出生於1707年的歐拉被譽為有史以來最偉大的數學家之一。歐拉從小就是一個數學天才,大學時他在神學院裡攻讀古希伯來文,但卻連續13次獲得巴黎科學院的科學競賽的大獎。
  • Less is more,你的歐拉白貓你做主
    該劇由趙麗穎和王一博領銜主演,張慧雯、陳若軒和孫堅聯合主演,目前更新至第8集,2小時播放破億,豆瓣上齊刷刷的五星好評就足見觀眾對該劇的喜歡和關注了。除去趙麗穎、王一博這對俊男靚女流量加持外,該劇的劇情也十分出彩,#周翡謝允一慄定情#的熱搜話題更是持續升溫,不少網友都感慨這種亮眼又硬核的CP實在是不可多得,必須粉!
  • 歐拉公式——上帝創造的數學公式
    第一期:行列式的幾何意義第二期:為什麼0.9999會等於1第三期:世界著名數學難題——圓內格點問題1743年,著名的數學家歐拉在一篇正式發表的論文中首次得到了如下這個結果指數函數ex當x為有理數時,可以用乘方和開根號來定義,對於一般實數是不是要用極限定義?歐拉公式中指數函數ex甚至取x值為虛數,那又該如何定義?這些問題正是歐拉公式給許多人留下神秘印象的原因。要解釋清楚歐拉公式和這麼多問題,我們該選擇從哪裡入手作為起點呢?
  • 關於歐拉公式的拓展,可以了解層層宇宙的存在形式和數理特徵
    關於歐拉公式:e^(πi)+1=0,關於歐拉公式的證明,可作如下的圖,我們可以把e^(θi)當做單位圓的圓周上的點的運動來描述,cosθ當然,舉世聞名的歐拉公式,有很多漂亮的證明方法。構思都很巧妙。我們拓展歐拉公式的表達形式,用來表達更高深的客觀現象。