題目描述
小賽是一名幸運的程序員。
雖然他成功幫助小朋友以最快時間奪回了狼堡,但是面試官卻打算和他說拜拜了。
理由是——遊戲天賦太高,有不務正業、走火入魔的傾向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 |
#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;
}
程序中可能會有一些不足,僅供大家參考。