Hihocoder1350-Binary Watch
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
Consider a binary watch with 5 binary digits to display hours (00 - 23) and 6 binary digits to display minutes (00 - 59).
For example 11:26 is displayed as 01011:011010.
Given a number x, output all times in human-readable format “hh:mm” when exactly x digits are 1.
输入
An integer x. (0 ≤ x ≤ 9)
输出
All times in increasing order.
样例输入
1
样例输出
00:01 00:02 00:04 00:08 00:16 00:32 01:00 02:00 04:00 08:00 16:00
题意
输出化成二进制(时化为5位,分化为6位)后有合起来x个1的所有时间
思路
这里需要用到一个glibc内置函数__builtin_popcount(n),表示十进制的n化成2进制后的1的个数,顺便普及一下其他几个内置函数
http://www.cnblogs.com/nysanier/archive/2011/04/19/2020778.html
然后遍历一遍,具体实现看代码
代码1
#include <bits/stdc++.h> using namespace std; int main() { int x; cin >> x; for (int i = 0; i < (1<<11); i++) { if (__builtin_popcount(i) == x) { int hour = i >> 6; int minute = i & 0x3f; if (hour < 24 && minute < 60) { cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << endl; } } } return 0; }
代码2
正常思想,不需要什么函数,位运算都不用。。
#include<bits/stdc++.h> using namespace std; int cnt1(int x) {//cnt=__builtin_popcount(x); int cnt = 0; while(x > 0) { if(x % 2) cnt++; x /= 2; } return cnt; } int main() { int x; int a[60]; scanf("%d",&x); for(int i=0;i<60;i++) a[i]=cnt1(i); for(int i=0;i<24;i++){ for(int j=0;j<60;j++){ if(a[i]+a[j]==x) printf("%02d:%02d\n",i,j); } } }
我会一直在