最近在網上看到百度的一道面試題,全文如下:
定義自然數上的操作,如果這個數是偶數則除以2,奇數則加1或者減1,求把一個大於1的數變成1,所需的最少步驟。例如:5 操作如下5-1=4 4/2=2 2/2=1
這裏有兩個思路一個是遞歸,一個是基於數的二進制表示,整個題意的大致思想就是用最少的操作把一個數的所有比特位除卻最高位外都變爲零。依據這兩種思路給出如下代碼:
//============================================================================
// Name : testCpp.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <time.h>
using namespace std;
int func1(int val) {
int i = 0;
while (val > 1) {
if (val & 1) {
if (val != 3 && (val & 2)) {
val++;
} else {
val--;
}
} else {
val >>= 1;
}
++i;
}
return i;
}
int func3(int val) {
if (val == 1)
return 0;
if (val & 1) {
int x = func3(val + 1) + 1;
int y = func3(val - 1) + 1;
return x > y ? y : x;
}
return func3((val >> 1)) + 1;
}
int main() {
int result = 1000000;
clock_t s1 = clock();
for (int index = 2; index <= result; index++) {
func1(index);
}
cout << "finish1->" << (clock() - s1) << endl;
s1 = clock();
for (int index = 2; index <= result; index++) {
func3(index);
}
cout << "finish3->" << (clock() - s1) << endl;
return 0;
}