119. How Many Ones Needed?

I'm a slow walker, but I never walk backwards.

Task Description
How Many Ones Needed?
要表示一個二進位的數字只需要用到兩個數字0跟1,若要表示某個特定的數值,會需要用到固定數量的0和1。
舉例來說,要將介於十進位5和10之間的數字(包含)表示成二進位:0101(兩個1)、0110(兩個1)、0111(三個1)、1000(一個1)、1001(兩個1)、1010(兩個1),總共會需要用到十二個1。
你需要寫一個程式來計算如果將介於範圍 a 和 b 之間(包含)的所有十進位整數表示為二進位會需要用到多少個1。
請使用此函數原型進行實作:int count_ones(int dec_num);
此函數會計算將傳入的十進位數字(dec_num)轉為二進位時會需要用到幾個1並回傳。

Hint

count_ones.h

打上 function header 以及相關的設定。

int count_ones(int dec_num);

count_ones.c

撰寫程式碼後對應上傳。

#include "count_ones.h"
int count_ones(int dec_num) {
    / add your code /
}

main.c

這個檔案無法更改也無須上傳。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include "count_ones.h"
 
int main() {
    int a, b;
 
    while(scanf("%d%d", &a, &b)) {
        int total_ones_num = 0;
        if (a == 0 && b == 0) break;
        for(int i = a;i <= b;i++) {
            total_ones_num += count_ones(i);
        }
        printf("%d\n", total_ones_num);
    }
 
    return 0;
}

Input Format
每一列測試資料包含兩個正整數 a 和 b (0≤a≤b≤10000000),最後一列有兩個0代表輸入結束。
Output Format
對每筆測試資料皆須輸出一個整數,代表將範圍 a 和 b 之間(包含)的所有十進位整數表示為二進位會需要用到多少個1
Sample Input

1
2
3
5 10
20 30
0 0

Sample Output

1
2
12
35

Submit

Login

Testdata Set

Download Testdata