一个二进制数,如果1的个数多于0的个数 ,则称A类数,否则称非A类数。例如:1001,1000为非A类数,1101和1111000为A类数。
16之内对应的二进制数是A类数的为:1,3,5,6,7,11,13,14,15。所以16之内有9个A类数。
对给定的整数,求在该整数范围内有多少个A类数。
输入格式:
输入一些正整数N(N<=400000),一行一个数。以^Z或文件结束符结束输入。
输出格式:
输出对应整数范围内A类数的个数。一行一个数。末尾输出换行符。
输入样例:
在这里给出一组输入。例如:
16 20
输出样例:
在这里给出相应的输出。例如:
9 10
思路:同7-3 先将A类数存进一个数组减少时间
1 #include <iostream>
2 using namespace std;
3 #define maxN 400005
4 int cnt[maxN];
5
6 int main()
7 {
8 int i, num, k, len;
9 cnt[1] = 1;
10 for (i = 2; i < maxN; i++)
11 {
12 num = i;
13 k = 0;
14 len = 0;
15 while (num)
16 {
17 len++;
18 if (num % 2 == 1)
19 k++;
20 num = num / 2;
21 }
22 cnt[i] = cnt[i - 1];
23 if (k > len / 2)
24 cnt[i] ++;
25 }
26 while (scanf("%d", &num) != EOF)
27 printf("%d\n", cnt[num]);
28 return 0;
29 }
来源:https://www.cnblogs.com/luoyoooo/p/12215747.html