[数字逻辑]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 }