一個(gè)余數(shù)問(wèn)題的思考

剛剛在貼吧上看到一個(gè)很簡(jiǎn)單的算法小問(wèn)題瞧预,順便看到了很多人不同的思路仪召。我覺(jué)得很有意思,所以也來(lái)研究一下松蒜。

問(wèn)題如下:

一筐雞蛋:
1個(gè)1個(gè)拿扔茅,正好拿完。
2個(gè)2個(gè)拿秸苗,還剩1個(gè)召娜。
3個(gè)3個(gè)拿,正好拿完惊楼。
4個(gè)4個(gè)拿玖瘸,還剩1個(gè)秸讹。
5個(gè)5個(gè)拿,還差1個(gè)雅倒。
6個(gè)6個(gè)拿璃诀,還剩3個(gè)。
7個(gè)7個(gè)拿蔑匣,正好拿完劣欢。
8個(gè)8個(gè)拿,還剩1個(gè)裁良。
9個(gè)9個(gè)拿凿将,正好拿完。
問(wèn):筐里最少有幾個(gè)雞蛋价脾?

題目很簡(jiǎn)單牧抵,我們可以直接用暴力窮舉法。這當(dāng)然是最簡(jiǎn)單的辦法侨把, 下面是這種方法的Kotlin代碼犀变。運(yùn)行之后,得到結(jié)果為1449秋柄。

fun answer1() {
    var n = 0
    while (true) {
        if (n % 2 == 1 && n % 4 == 1 && n % 5 == 4 && n % 6 == 3 && n % 7 == 0 && n % 8 == 1 && n % 9 == 0) {
            break
        }
        n++
    }
    println(n)
}

當(dāng)然暴力窮舉雖然簡(jiǎn)單获枝,但是效率并不是很高,對(duì)于這個(gè)問(wèn)題來(lái)說(shuō)华匾,循環(huán)運(yùn)行了1449次。我們可以分析題目特點(diǎn)机隙,簡(jiǎn)化循環(huán)的運(yùn)行次數(shù)蜘拉。

首先來(lái)看看題目,很明顯第一句是廢話(huà)有鹿,因?yàn)槿魏握麛?shù)都可以被1整除旭旭。然后是第二句,這表明這個(gè)數(shù)是一個(gè)奇數(shù)葱跋。第三句和第九句明顯重復(fù)持寄,可以被9整除,那么必然也可以被3整除来庭,所以只看第九句就可以了蜀备。還有第五句需要注意一下婉弹,因?yàn)檫@里是被5除還差1個(gè),所以是還剩4個(gè)模庐。我看貼吧里有些人審題不嚴(yán),導(dǎo)致做了一個(gè)錯(cuò)誤答案油宜。

經(jīng)過(guò)一番分析掂碱,上面的題目就變成了下面這樣的怜姿。

奇數(shù)
能被9整除
除以4余1
除以5余4
除以6余3
能被7整除
除以8余1


注意到7和9互質(zhì),所以答案必然是63的倍數(shù)疼燥,而且還是個(gè)奇數(shù)沧卢,所以是奇數(shù)倍。所以我們的代碼可以改進(jìn)一下醉者。代碼中的count用于統(tǒng)計(jì)循環(huán)次數(shù)但狭,這次結(jié)果和上次一樣,但是循環(huán)次數(shù)僅為12次湃交,每次要判斷的條件也減少了很多熟空。

fun answer2() {
    var n = 63
    var count = 0
    while (true) {
        count++
        if (n % 4 == 1 && n % 5 == 4 && n % 6 == 3 && n % 8 == 1) {
            break
        }
        n += 63 * 2
    }
    println("n=$n,count=$count")

}

當(dāng)然還可以進(jìn)一步優(yōu)化。由于這個(gè)數(shù)除以5余4搞莺,可以想到該數(shù)的個(gè)位數(shù)字不是4就是9息罗,但是由于是奇數(shù),那么個(gè)位數(shù)必然是9才沧,而且這個(gè)數(shù)是63的倍數(shù)迈喉。而除以4余1除以8余1這兩個(gè)條件可以簡(jiǎn)化為除以8余1。所以最后代碼就變成了這樣温圆,循環(huán)僅僅循環(huán)了3次挨摸。

fun answer3() {
    var n = 63 * 3
    var count = 0
    while (true) {
        count++
        if (n % 8 == 1) {
            break
        }
        n += 630
    }
    println("n=$n,count=$count")
}

我還看到貼吧上有人說(shuō)用同余定理算,但是我比較笨岁歉,沒(méi)理解怎么用同余定理來(lái)計(jì)算得运。不過(guò)以前我倒是遇到過(guò)類(lèi)似的題目,所以最后來(lái)介紹一下锅移。

我遇到的題目類(lèi)似下面這樣:

一個(gè)數(shù)除以2余1熔掺,除以3余2,除以4余3非剃,這個(gè)數(shù)最小是幾置逻?

這個(gè)問(wèn)題倒是有一個(gè)簡(jiǎn)便方法,由于余數(shù)恰好和除數(shù)只差1备绽,所以如果在被除數(shù)上加1券坞,那么它就可以同時(shí)被2、3肺素、4整除恨锚,所以這個(gè)數(shù)最小應(yīng)該是2、3倍靡、4的最小公倍數(shù)再減1眠冈,所以應(yīng)該是23 。

回到我們這道題目來(lái)說(shuō),由于余數(shù)每次都不一樣蜗顽,所以沒(méi)辦法這么做布卡。不過(guò)我想了想,能不能通過(guò)加一個(gè)數(shù)雇盖,讓余數(shù)都變得相同忿等。由于我數(shù)學(xué)不好,也不懂?dāng)?shù)論這些專(zhuān)業(yè)知識(shí)崔挖,所以直接用代碼模擬一下贸街,發(fā)現(xiàn)確實(shí)可以得到一個(gè)數(shù),讓答案加上這個(gè)數(shù)以后狸相,所有余數(shù)都相同薛匪。這個(gè)數(shù)是1071,這時(shí)候余數(shù)都是0 脓鹃。Kotlin代碼如下逸尖。

fun cal() {
    val numbers = hashMapOf(
            2 to 1,
            3 to 0,
            4 to 1,
            5 to 4,
            6 to 3,
            7 to 0,
            8 to 1,
            9 to 0)
    var n = 0
    while (true) {
        n++
        for (k in numbers.keys) {
            val old = numbers[k]
            numbers[k] = (old!! + 1) % k
        }
        val set = numbers.values.toSet()
        if (set.size == 1) {
            break
        }
    }
    println("這個(gè)數(shù)是:$n")
}

有了這個(gè)數(shù),我們就可以用上面的方法來(lái)計(jì)算結(jié)果了瘸右。答案加上1071之后娇跟,可以被2-9的所有數(shù)整除,所以2-9的最小公倍數(shù)再減去1071太颤,就是我們要求的答案苞俘。而2-9的最小公倍數(shù)也就是5-9的最小公倍數(shù),是2520龄章,再減去前面的1071吃谣,正好就是最一開(kāi)始我們得到的答案1449!

如果大家有更好的思路做裙,也可以告訴我岗憋,讓我們互相學(xué)習(xí),共同進(jìn)步菇用!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澜驮,一起剝皮案震驚了整個(gè)濱河市陷揪,隨后出現(xiàn)的幾起案子惋鸥,更是在濱河造成了極大的恐慌,老刑警劉巖悍缠,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卦绣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡飞蚓,警方通過(guò)查閱死者的電腦和手機(jī)滤港,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人溅漾,你說(shuō)我怎么就攤上這事山叮。” “怎么了添履?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵屁倔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我暮胧,道長(zhǎng)锐借,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任往衷,我火速辦了婚禮钞翔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘席舍。我一直安慰自己布轿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布俺亮。 她就那樣靜靜地躺著驮捍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脚曾。 梳的紋絲不亂的頭發(fā)上东且,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音本讥,去河邊找鬼珊泳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拷沸,可吹牛的內(nèi)容都是我干的色查。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼撞芍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秧了!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起序无,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤验毡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后帝嗡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體晶通,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年哟玷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狮辽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖喉脖,靈堂內(nèi)的尸體忽然破棺而出椰苟,到底是詐尸還是另有隱情,我是刑警寧澤树叽,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布尊剔,位于F島的核電站,受9級(jí)特大地震影響菱皆,放射性物質(zhì)發(fā)生泄漏须误。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一仇轻、第九天 我趴在偏房一處隱蔽的房頂上張望京痢。 院中可真熱鬧,春花似錦篷店、人聲如沸祭椰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)方淤。三九已至,卻和暖如春蹄殃,著一層夾襖步出監(jiān)牢的瞬間携茂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工诅岩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讳苦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓吩谦,卻偏偏與公主長(zhǎng)得像鸳谜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子式廷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容