#include<stdio.h>//a414. 位元運算之進位篇
/*提示 :因為本題測資檔較大,請使用 scanf 輸入、 printf 輸出。
scanf:
函數功能: 輸入
運用: scanf("格式控制符",地址列表);
優點: 比cin省時
歷史: 本是c語言之輸入
格式控制符:
d:輸入十進位制整數
u:輸入無符號整數
o:輸入八進位制整數
x:輸入十六進位制整數
c:輸入單個字元
s:輸入字串(輸入時以非空格開始,空格結束,自動填補成以'\0' 為結尾)
f:輸入浮點數float
l:可用於整型、實型(例:%ld、%lf(double))
*/
int main(){
int n;
while(scanf("%d",&n), n!=0)/*&取址運算子*/{
int ans=0;
while(n!=0){
int b=n%2;//b==每位除二餘數=二進位的一位
//以下參連除法
n/=2;
if(b==0) break;
else ans++;//二進位的最低位元起,有幾個連續的1,加1後就會進位幾次 EX:111+1=1000
}
printf("%d\n", ans);
}
return 0;
}
/*
內容
一個數在電腦裡遞增時需要進位幾次。
輸入說明
輸入的每一行有一個十進制正整數 N (1<=N<=2147483647)。輸入的最後一行有一個 0,代表輸入的結束,
這個數字請勿做任何處理。
輸出說明
對於每個正整數 N ,請輸出以二進制計算 N+1 時所需的進位次數。
範例輸入 #1 解釋:
1 1+1
4 100+1
7 111+1
17 10001+1
0
_________________________________________________________________________________________________
EX:7.625:
7:連除法
7/2=3...'1' 3/2=1...'1' 1/2=0...'1' ----> 7==>111
0.625:連乘法
0.625*2='1'.250 1.250%1=0.250
0.250*2='0'.50 0.50%1=0.50 ----> 0.625==>101
0.50*2='1'.0(小數部分為0)
7.625==>111.101
_________________________________________________________________________________________________
範例輸出 #1
1
0
3
1
*/