賽碼網,將功贖過問題,用C語言自己實現的一個程序,僅供參考

題目描述								

小賽是一名幸運的程序員。

雖然他成功幫助小朋友以最快時間奪回了狼堡,但是面試官卻打算和他說拜拜了。

理由是——遊戲天賦太高,有不務正業、走火入魔的傾向QAQ……

儘管小賽很不能接受這個理由,可是卻只能心灰意冷地吃下這個結果。

然而,在他即將走出門的時候,面試官給了幸運的小賽一個最後的機會。

原來,面試官的手機被他調皮的兒子小明用一個數字作爲密碼鎖上了。

小明只記得這個數字的十進制範圍是l~r,且這個數的二進制表示中恰有m個1,卻不記得確切的數字了。

面試官可急壞了。這纔有了小賽一個將功贖過的機會。

他想要讓小賽算出,他最壞情況下,要試多少次密碼才能確保打開手機呢?

請輸出這個次數。

輸入

輸入僅一行,包含三個整數l,r,m,其中l,r表示這個數的十進制範圍是l~r,m表示這個數的二進制表示中有m個1.

數據保證——

對於30%的測試點,0<=l<=r<=20,0<=m<=5,

對於70%的測試點,0<=l<=r<=1000,0<=m<=10,

對於100%的測試點,0<=l<=r<=2000000,0<=m<=24.

樣例輸入

1 4 2

輸出

輸出一行,包含一個整數,表示面試官最壞情況下,要試多少次密碼才能確保打開手機。

如果小明記錯了(也就是不存在任何一個數滿足),則輸出"-1"(不含引號)。

樣例輸出

1

時間限制C/C++語言:2000MS其它語言:4000MS
內存限制C/C++語言:65536KB其它語言:589824KB
C語言程序實現如下:
#include <stdio.h>
#include <stdlib.h>

int sum1(int n)
{
    int sum=0;
    while(n)
    {
        n=n&(n-1);
        sum++;
    }
    return sum;
}
int main()
{
    int i,l,r,m,result=0;
    scanf("%d%d%d",&l,&r,&m);
    for(i=l; i<=r; i++)
    {
        if(sum1(i)==m)
            result++;
    }
    if(result!=0)
    {
        printf("%d\n",result);
    }
    else
    {
         printf("-1\n");
    }
    return 0;
}

程序中可能會有一些不足,僅供大家參考。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章