[数字逻辑]7-6 A类数 (20分)

一个二进制数,如果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 }

猜你喜欢

转载自www.cnblogs.com/luoyoooo/p/12215747.html