最近發現了幾個公司招聘的筆試機試題,雖然是兩年前的,但是題目還不錯,所以做了做,下面給出自己對一些題的理解。
問題描述:
下面**中for迴圈共執行了多少次?
unsigned short i,j;
for(i = 0,j = 2;i != j;i += 5, j+ = 7)()
問題分析:
首先,看到變數i和j都是無符號的整數,我們知道,無符號整數在記憶體中是以16位表示的,也就是兩個位元組,所以要想到i和j的所能取到的最大值。
接著,就是看for迴圈停止條件,可以看出,這裡只有乙個條件,即當i== j 時,才停止for迴圈。
最後,就是找出在什麼情況下,i和j才能相等,列出等式,解出即可。
解決思路:
i,j為無符號短整型整數,用2個位元組表示,即,i和j的取值範圍為0-65535,且當i或j為最大值時,即等於65535,在記憶體中也就是16位全溢位,這時再加1,則在記憶體中最高位會溢位,取低16位,即這時變成了16位全0,也就是說當無符號整數達到最大值後,如果再加1,則會變成0.
明白了這一點,這個題就簡單了,其實這個題就是考查無符號整數的範圍及記憶體溢位的情況,從for迴圈中可以看出,停止迴圈的條件只有乙個,那就是i == j,但是可以看出j要比i增加的快,也就說當j先增加到最大值後,然後又開始從0開始增加,才有可能和i相等。
當然了,這個從數學的角度考慮,不用考慮這麼多,其實就是乙個解一元一次方程的問題:
設迴圈的次數為c,要停止迴圈,則有以下等式成立
((2+7*c) - (0 + 5*c)) % pow(2,16) = 0
可以解出c = (pow(2,16) - 2) / 2 = 32767 或 c = -1(不合理,捨去),也就是說這個for迴圈共執行了32767次
最後,可以用程式驗證一下,看結果是否正確,如下:
#include #include int main()
printf("for迴圈共執行了%d次\n",count);
}
執行結果:
for迴圈共執行了32767次
可以看出,上面的思路沒錯.
2012搜狗校園招聘筆試題
include using namespace std int main unsigned char p unsigned char input int s 0 int temp sizeof input for int i 0 ichar v p i if v 0 s v a i printf d...
2012搜狗校園招聘筆試題
1 下面 中for迴圈共執行了多少次?unsigned short i,j for i 0,j 2 i j i 5,j 7 unsigned short占用2個位元組,當資料範圍到頭了 2 16 1 就又從0開始計數了,這個其實就是兩輛汽車行駛在乙個圓圈裡的汽車追及問題。乙個速度為5,乙個速度為7,...
搜狗校園招聘筆試
定義兩個大於2的偶數之間的距離,為這兩個數之間質數的個數。從小到大輸入n個大於2的偶數,輸出所有數兩兩之間距離的總和 應該有n n 1 2個距離,輸出總和就好 第一行是輸入偶數的個數,最小為2,最大可能到幾萬。之後每行為乙個偶數,最小是4,最大可能是幾百萬,不重複的公升序排列。輸出資料兩兩間距離的總...