給定乙個正整數 n,你可以做如下操作:
1. 如果 n 是偶數,則用 n / 2替換 n。
2. 如果 n 是奇數,則可以用 n + 1或n - 1替換 n。
n 變為 1 所需的最小替換次數是多少?
思路:
1. 如果 n 是偶數,則用 n / 2替換 n。當為2的冪時,降冪是最快的選擇;
2. 如果 n 是奇數,則可以用 n + 1或n - 1替換 n。選擇n+1或者n-1取決於n+1或者n-1是2的冪次方;
3. 如果 n 是奇數,當n+1(n-1)之後,如果除以2任然是偶數,那麼就選擇n+1(n-1),因為奇數比偶數多一步的處理,如果兩種操作後都是偶數,那麼選擇n-1;
4. 特殊數字3,當然是3-1最快;
public
static
intintegerreplacement(long n)
if(n == 2)
if(n == 3)
int count = 0;
boolean flage = true;
while(flage)
if(n % 2 == 1)
if(power2(n + 1))
//如果 n 是奇數,當n+1(n-1)之後,如果除以2任然是偶數,那麼就選擇n+1(n-1)
n = select(n);
count ++;
system.out.println("n: " + n + ", " + "count: " + count);
}count ++;
n = n / 2;
}return count;
}/**
*@title: power2
*@description: 判斷乙個數是否為2的冪次方
*@param num
*@return
*@author chenxy
*@date 2018-4-8 上午8:43:34
*/public
static
boolean
power2(long num)
for(int i = 0; i <= 32; i++)
}return
false;
}/**
*@title: select
*@description:
*@param num 如果 n 是奇數,當n+1(n-1)之後,如果除以2任然是偶數,那麼就選擇n+1(n-1),因為奇數比偶數多一步的處理;
*@return
*@author chenxy
*@date 2018-4-8 上午9:01:42
*/public
static
long
select(long num)
boolean flage1 = false;
boolean flage2 = false;
long temp = 0;
temp = (num - 1)/2;
if(temp % 2 == 0)
temp = (num + 1)/2;
if(temp % 2 == 0)
if(flage1)
if(flage2)
return num;
}
結果:
n = 2147483647
n: 2147483647, count: 0
n: 2147483648, count: 1
n: 1073741824, count: 2
n: 536870912, count: 3
n: 268435456, count: 4
n: 134217728, count: 5
n: 67108864, count: 6
n: 33554432, count: 7
n: 16777216, count: 8
n: 8388608, count: 9
n: 4194304, count: 10
n: 2097152, count: 11
n: 1048576, count: 12
n: 524288, count: 13
n: 262144, count: 14
n: 131072, count: 15
n: 65536, count: 16
n: 32768, count: 17
n: 16384, count: 18
n: 8192, count: 19
n: 4096, count: 20
n: 2048, count: 21
n: 1024, count: 22
n: 512, count: 23
n: 256, count: 24
n: 128, count: 25
n: 64, count: 26
n: 32, count: 27
n: 16, count: 28
n: 8, count: 29
n: 4, count: 30
n: 2, count: 31
n: 1, count: 32
n = 10000
1n: 10000, count: 0
1n: 5000, count: 1
1n: 2500, count: 2
1n: 1250, count: 3
1n: 625, count: 4
2n: 624, count: 5
1n: 312, count: 6
1n: 156, count: 7
1n: 78, count: 8
1n: 39, count: 9
2n: 40, count: 10
1n: 20, count: 11
1n: 10, count: 12
1n: 5, count: 13
1n: 4, count: 14
1n: 2, count: 15
1n: 1, count: 16
1 整數反轉思路及解決方案
1.理解題意 逆序輸出 首尾交換 2.資料結構及演算法思維選擇 1.逆序輸出 1.整數轉字串,字串轉陣列 2.資料結構 字元陣列 3.演算法思維 遍歷 2.首尾交換 1.整數轉字串,字串轉陣列 2.資料結構 字元陣列 3.演算法思維 遍歷 3.基本解法及編碼實現 1.暴力解法 1.整數轉字串,再轉字...
洛谷P1138 第k小整數 題目思路
利用set容器去重,排序的特點讀入資料 然後利用迭代器把資料一一輸入乙個陣列中 因為set無法直接輸出 利用陣列輸出第k小的數字 當第k小的數字為0時,表示無解,輸出no result 具體 include using namespace std int n,q,b 1000000 set a in...
亂碼的解決思路
推薦文章 1.理解清楚字元 字元集合 字元編碼方式 2.ucs 是通用字符集的簡稱,同unicode字符集是一套字元集合,ucs是iso組織的.3.亂碼的原因是,字元編碼方式 和 解碼方式不一致.a.先檢查putty或者secucecrt的字元編碼方式 如 指定為utf 8 b.其次檢查系統的語言環...