2016百度實習機試題 乘法表

2021-10-03 19:47:32 字數 1482 閱讀 3759

題目鏈結

題目描述:度度熊和爺爺在玩乙個乘法表遊戲。乘法表的第i行第j列位置的元素為i*j,並且乘法表下標編號從1開始,比如2 × 3乘法表為

1 2 3

2 4 6

爺爺十分聰明,對於n*m的乘法表,只要度度熊給出乙個數k,爺爺就能立刻告訴度度熊乘法表中元素按照不減順序排列之後,第k個元素是多少。你能重複這個遊戲嗎?

這道題剛開始沒想太多,直接排序輸出,後來看了大佬的思路才發現需要使用二分法進行查詢,具體的思路就是起始的時候start = 0,ends = n*m,然後統計middle的值在其中為從小到大第幾位,如果middle > 要求查詢次數k,那麼說明middle不符號條件,在middle+1與ends之間進行查詢,如果middle 《要求查詢次數k,那麼說明下一步應該在starts與middle-1之間進行查詢,以此類推。

每次統計總次數的時候有乙個小技巧,就是通過找尋前乙個乘法表與後乙個乘法表的關係進行查詢,

比如第二行 i= 2 ,m = 4

即2 4 6 8 /2以後 就簡化為 12 3 4 ( 是連續的乙個數列)

i =3 的話 3 6 9 12 同理簡化為1 2 3 4

這時候看出來沒, 要把中間值 mid 與同行的數列比較,計算本行比其小或者相等的有幾個的話,

做法是兩邊同除以 i 那麼相當於m/i 與 1 2 3 4 比較 ,假設m = 8

原因:乘法表是呈倍數增長的,第一行為1 2 3 4,第二行為2 4 6 8為第一行的倍數,除以i之後

相等於把後面行的數字都轉換到第一行進行比較

(第一行的數字乘以i = 第i行的數字)

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

intmain()

//middle/i為一行中比middle大的數字個數,如果數字個數超出一整行時

//一整行全部取出

else

//否則只取出一整行中符合條件的數即可

}//printf("total = %d\n",total);

//每次比較的為middle,但是每次可查詢的範圍

//為[start,ends]

if(total >= k)

//total比k大的情況說明下一次查詢的範圍為[starts,middle-1]

else

if(total < k)

//total比k小的情況下說明下一次查詢的範圍為[middle+1,ends]

}printf

("%lld\n"

,start)

;//之前這裡忘記使用lld的形式輸出了,如果以%d的形式輸出會有測試點不過。

return0;

}

百度 乘法表

度度熊和爺爺在玩乙個乘法表遊戲。乘法表的第i行第j列位置的元素為i j,並且乘法表下標編號從1開始,比如2 3乘法表為 1 2 3 2 4 6 爺爺十分聰明,對於n m的乘法表,只要度度熊給出乙個數k,爺爺就能立刻告訴度度熊乘法表中元素按照不減順序排列之後,第k個元素是多少。你能重複這個遊戲嗎?輸入...

百度面試題 乘法表

這道題簡要題目如下 乘法表第i行第j列位置的元素為i j,並且乘法表下表編號從1開始,比如2 3乘法表為 1 2 3 2 4 6 那麼對於n m的乘法表按照不減順序排列之後,求第k個元素的值是多少?看到這個題,大多數同學想到的肯定是得到這個乘法表的數值,然後進行排序,從而得到k的值,這樣做的確沒問題...

百度2016實習真題 編號轉化

題目鏈結 小b最近對電子 產生了濃厚的興趣,她覺得電子 很神奇,功能遠比她想象的強大。她正在研究的是單元格的座標編號,她發現 單元一般是按列編號的,第1列編號為a,第2列為b,以此類推,第26列為z。之後是兩位字元編號的,第27列編號為aa,第28列為ab,第52列編號為az。之後則是三位 四位 五...