赛码网编程练习(二)


这个题目不是很难,只要会十进制转二进制就可以了,另外就是注意在几个变量条件每次循环时的初始化就可以了,下面是我的代码

// 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;
}

 

posted @ 2016-08-07 15:09  沐雨橙风fire  阅读(774)  评论(0编辑  收藏  举报