算得到1需要的最少操作次數

2021-07-27 07:21:38 字數 1277 閱讀 2403

實現乙個函式,對乙個正整數n,算得到1需要的最少操作次數。操作規則為:如果n為偶數,將其除以2;如果n為奇數,可以加1或減1;一直處理下去。

例子:func(7) = 4,可以證明最少需要4次運算

n = 7

n-1 6

n/2 3

n-1 2

n/2 1

要求:實現函式(實現盡可能高效) int func(unsign int n);n為輸入,返回最小的運算次數。給出思路(文字描述),完成**,並分析你演算法的時間複雜度。

#include using namespace std;

int func(unsigned int n)

int func1(int n)

else

else

}

} return s[n];

}int func2(unsigned int n)

//如果是奇數,+1還是-1的標準是:n'這個整數的各個位中為1的個數最少,如果相同,當然-1.

t = n - 1;

t = (t & 0x55555555) + ((t & 0xaaaaaaaa) >> 1);

t = (t & 0x33333333) + ((t & 0xcccccccc) >> 2);

t = (t & 0x0f0f0f0f) + ((t & 0xf0f0f0f0) >> 4);

t = (t & 0x00ff00ff) + ((t & 0xff00ff00) >> 8);

t = (t & 0x0000ffff) + ((t & 0xffff0000) >> 16);

s = n + 1;

s = (s & 0x55555555) + ((s & 0xaaaaaaaa) >> 1);

s = (s & 0x33333333) + ((s & 0xcccccccc) >> 2);

s = (s & 0x0f0f0f0f) + ((s & 0xf0f0f0f0) >> 4);

s = (s & 0x00ff00ff) + ((s & 0xff00ff00) >> 8);

s = (s & 0x0000ffff) + ((s & 0xffff0000) >> 16);

if(s < t)

else

k ++;

} return k;

}int _tmain(int argc, _tchar* argv)

system("pause");

return 0;

}

對乙個正整數n,算得到1需要的最少操作次數

實現乙個函式,對乙個正整數n,算得到1需要的最少操作次數。操作規則為 如果n為偶數,將其除以2 如果n為奇數,可以加1或減1 一直處理下去。例子 func 7 4,可以證明最少需要4次運算 n 7 n 1 6 n 2 3 n 1 2 n 2 1 要求 實現函式 實現盡可能高效 int func un...

1713 得到子串行的最少操作次數

題目描述 給你乙個陣列 target 包含若干 互不相同 的整數,以及另乙個整數陣列 arr arr 可能 包含重複元素。每一次操作中,你可以在 arr 的任意位置插入任一整數。比方說,如果 arr 1,4,1,2 那麼你可以在中間新增 3 得到 1,4,3,1,2 你可以在陣列最開始或最後面新增整...

奶牛喝水最少需要的交換次數

題目描述 有n 1 n 1000 頭奶牛,它們都被標上乙個優先等級編號 1,2或3。用來表示它們喝水時的優先次序,編號為l的最優先,編號為2的其次,編號為3的最後。每天奶牛開始時排成一行,但總是很亂,需要你把它們重新排成編號為1的奶牛在最前面,編號為2的其次,編號為3的奶牛在最後。你能計算出最少需要...