#include<stdio.h>
#include<math.h>
int main () {
int n,np,a,b,p[10000] = {0},q[10000]= {0};
while(1) {
scanf("%d",&n);
if(n == 0) {
break;
}
a = 0;
b = 0;
np = n + 1;
while(n != 0) {
p[a] = n % 2;
n /= 2;
a++;
}
while(np != 0) {
q[b] = np % 2;
np /= 2;
b++;
}
if(a < b) {
printf("%d\n",b-1);
}
if(a == b) {
for(int i = a - 1 ; i >= 0; i--) {
if(p[i] != q[i]) {
if(p[i-1] != q[i-1]) {
printf("%d\n",i);
break;
}else {
printf("0\n");
break;
}
}
}
}
}
return 0;
}
n是輸入的數字,np是n+1
加判斷n==0就直接break
先各別算出它們的二進位並用陣列儲存,注意陣列的第一個放的數字是二進位的最低位
然後我們發現只要b>a也就np的進位數比a多時,答案就是b-1個進位數(因為陣列是從0號開始)
否則a == b時,也就是它們位元數相同,我們要找出他們不一樣的時候會發生的情況
注意是從最高位開始對比,如果有不同的話則看他的下一位如果也是不同那就是有進位,他的進位數就是i,然後break
如果都一樣那就是輸出0,畢竟沒有任何進位,然後break
流程大概就是這樣~直觀的解題XD