一、引題
題目大意:a和b
兩個人一起吃飯,一共有
n道菜,從
0,1,……
n-1編號,菜按順序輪流上,
a只能吃偶數編號的菜,即
0,2,4
……,b
只能吃奇數編號的的,每個人都可以選擇吃或不吃。每道菜對應乙個歡樂度
2^i(
i=0,1
,……,
n-1),現在知道
d =
歡樂度(
a-b) 的值,問他們兩總共吃了幾道菜?
解題思路:
當b吃乙個菜時,在對應的位置需要 -2^i 等於(-2)^i,偶數字置時2和 -2沒有區別,所以判斷某個位置有沒有吃,只需要將d化為負二進位制即可知。
實現:此處我們用除(-2)取餘法來實現將乙個數轉換為負二進位制,但是不記錄最後結果,只判斷1的個數即可得到結果。
int solve (int d , int n)
int num = 0 ; //記錄1的個數
int k = 0 ; //記錄當前位
while(d != 1 ) //結束條件
if(d % (-2) == 0)
d = d / (-2);
k ++ ;
continue;
if(d < 0 ) d = d / ( -2 ) + 1; //此處需要特別注意,計算機在計算負數除法時會和實際結果有偏差
else d = d / (-2) ;
num ++ ;
k ++ ;
if(k > n - 1 ) break ;
if(k <= n - 1) return num ;
else return -1;
二、延伸
由此我們可以得出一類問題的解法:即將某類差值問題、求和問題等凡是和n的冪(遞增)有關的問題都可以嘗試著用進製轉換問題去解決。
在轉換的時候需要注意以下幾點:
1、轉換為負數進製時商的問題
2、轉換結束條件
關於這兩個問題用幾個例子來說明,更好理解:
將11轉換為-2進製:
11 1
-5 1
3 1 //注意此處為三,編寫**需要處理
-1 1
1 //商為1 , 小於|-2|,轉換結束
所以11轉換為-2進製為 11111 ,但是11轉換為二進位制是1011.
將24轉換為 -4 進製:
24 0
-6 2
2 // 此處為2 ,計算機算為1,需要處理。2 小於4 ,轉換結束
24的-4進製為 :220
**實現參照引題,稍作修改即可。
進製轉換問題
基礎 進製轉換問題 easy time limit 1000ms memory limit 65536k total submit 271 accepted 153 description 若將乙個正整數n化為二進位制,在此二進位制數中,我們將數字1的個數多於數字0的個數的這類二進位制數稱為a類數,...
進製轉換問題
基礎 進製轉換問題 easy time limit 1000ms memory limit 65536k total submit 271 accepted 153 description 若將乙個正整數n化為二進位制,在此二進位制數中,我們將數字1的個數多於數字0的個數的這類二進位制數稱為a類數,...
進製轉換問題
最近公司在招聘開發工程師,想考察一下他們的基本功和常識。問了進製轉換的問題,有很多人就徹底懵逼了,其實進製轉換就是高中學習的排列組合的問題。想必大家碰見過這樣的問題。有三個抽屜,現在又7種顏色的球若干。現要求每個抽屜必須放且只能放乙個球,問多少種放法。其實這就是每個抽屜都有7個選擇的機會,而他們相互...