這道題簡要題目如下:
乘法表第i行第j列位置的元素為i*j,並且乘法表下表編號從1開始,比如2*3乘法表為:
1 2 3
2 4 6
那麼對於n*m的乘法表按照不減順序排列之後,求第k個元素的值是多少?
看到這個題,大多數同學想到的肯定是得到這個乘法表的數值,然後進行排序,從而得到k的值,這樣做的確沒問題,但顯然沒有太多技巧性。那麼到這就開始講講我大概的思路吧。
剛開始拿到這道題,大家肯定都是先吧這個乘法表畫出來,我一開始想的是畫斜線,那麼斜線兩邊的值肯定是相同的,同時也是畫斜線這一斜行(說的怎麼那麼彆扭,意會就好)中最小的值,越到中間越大,最中間的值是最大的,我曾設想這兒會是突破口。然而,我發現從第四行(這裡以及後面這段思想的所有行都是所謂的斜行)開始的最大值6要比第五行的最小值5要大,那這麼說的話按遞增序列找第k值豈不是還要拐彎,所以這個想法到這兒終止了。
這時候我開始第二個想法,從數1開始,我看他重複的次數,這樣遞增下去不就知道了k的值麼,那麼這些數的個數是多少呢。我們閱讀題目知道,這個題是乘法表,表中的數值都是i*j求得的,那麼就是說每次乘出了相同的值,這個數就會多重複一次。顯然(可怕的顯然,漫長的思想過程自己去體會23333),這個重複的次數就是約數的個數了。那麼我們直接求約數的個數不就可以直接得到這個數重複次數,從而遞增得到k的值嗎?(我真是太機制了)
然而,高興太早果然會出問題的,求約數個數只能解決掉上三角,下三個這些值出現次數該怎麼算啊,而且他還不是連著的。(頭疼)一定有解決辦法的,而且我也不覺得我的求約數法的思路有問題,那問題出在哪了?(叮咚)對了,乘法表有自己的界線限制著,所以下三角不能得到所有的重複次數(理想的),那麼我們給它乙個條件限制不就行了,這樣我們就能得到1~m*n(注意為什麼是m*n)的所有出現次數了,那麼給個遞增我們就求出了第k個數的值了(是不是很簡單)。
**如下:
#include
int result(int
m, int n, int k);
int result(int
m, int n, int k)
return value;
}void main(void)
i--;
printf("the value is %d\n", i);
}
那麼現在問題來了,這個求約數的演算法實在是太二了,好吧,不知道有沒有更好的演算法,希望有大牛能在給出自己寶貴的意見,謝謝大家。 百度 乘法表
度度熊和爺爺在玩乙個乘法表遊戲。乘法表的第i行第j列位置的元素為i j,並且乘法表下標編號從1開始,比如2 3乘法表為 1 2 3 2 4 6 爺爺十分聰明,對於n m的乘法表,只要度度熊給出乙個數k,爺爺就能立刻告訴度度熊乘法表中元素按照不減順序排列之後,第k個元素是多少。你能重複這個遊戲嗎?輸入...
2016百度實習機試題 乘法表
題目鏈結 題目描述 度度熊和爺爺在玩乙個乘法表遊戲。乘法表的第i行第j列位置的元素為i j,並且乘法表下標編號從1開始,比如2 3乘法表為 1 2 3 2 4 6 爺爺十分聰明,對於n m的乘法表,只要度度熊給出乙個數k,爺爺就能立刻告訴度度熊乘法表中元素按照不減順序排列之後,第k個元素是多少。你能...
百度面試題
有一根27厘公尺的細木桿,在第3厘公尺 7厘公尺 11厘公尺 17厘公尺 23厘公尺這五個位置上各有乙隻螞蟻。木桿很細,不能同時通過乙隻螞蟻。開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一厘公尺的距...