这个题目不是很难,只要会十进制转二进制就可以了,另外就是注意在几个变量条件每次循环时的初始化就可以了,下面是我的代码
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<stdio.h> #include <iostream> using namespace std; int main() { int l, r, m; while (cin >> l >> r >> m){ int tricks = 0; for (int k = l; k <= r; k++){ int i = k; int countn = 0;//保存二进制数组下标 int countone = 0;//保存二进制数中数字1的个数 int binaryNum[1000]; while (i != 0){ //判断条件为:除以2之后的商不等于1 binaryNum[countn] = i % 2; //取余后的数字存入数组 i /= 2; //i = i/2; 进行下一轮的判断 countn++; //此变量用来指定数组下标 } for (int j = 0; j < countn;j++){ if (binaryNum[j] == 1) countone++; //出现一次1就累加 } if (countone == m){ tricks += 1; } } if (tricks == 0) printf("-1\n"); else printf("%d\n", tricks); } }
后来这个题看了大神的代码,瞬间感觉大神很厉害,下面是大神的代码,比自己的简洁,而且加入了越界判断,求二进制中1的个数用的是关系运算符。
大神代码:
#include<iostream> using namespace std; int cnt_one(int k) { int c=0; while(k){ k=k&(k-1); c++; } return c; } int main() { int l,r,m; int k,cnt; while(cin>>l>>r>>m){ if(l<0 || r<0 || l>r || r>2000000 || l>2000000 || m<0 || m>24) return 0; cnt=0; for(k=l;k<=r;k++){ if(cnt_one(k)==m) cnt++; } if(cnt>0) cout<<cnt<<endl; else cout<<-1<<endl; } return 0; }