题目:
一个数可以用二进制表示,也可以用十进制表示,如果该数的二进制表示法所有位数字之和等于十进制表示法所有位数字之和,则称该数为神奇数。比如:21(十进制)=10101(二进制),所有位数之和为2+1=3,1+0+1+0+1=3。求小于等于M的神奇数有多少个。
输入:
输入的第一行指定用例数量T;
用例的第一行输入数字M;
输出:
输出神奇数字的个数
例子:
Input:
2
100
300
Output:
3
11
解题思路:
思路非常直观,分别计算出二进制表示法所有位数字之和与十进制表示法所有位数字之和,其中将数字转换成二进制数并统计1的个数这种有关二进制的问题可以调用STL中的bitset库,这里直接调用count()函数即可获得所有位数字之和。
#include<iostream>
#include<bitset>
#include<vector>
using namespace std;
bool isMagic(int num)
{
//化成无符号2进制
bitset<32> bs(num);
size_t TwoCount = bs.count();
//将数字分离放进vector中
vector<int> temp;
while (num)
{
temp.push_back(num % 10);
num /= 10;
}
size_t TenCount = 0;
for (vector<int>::iterator it = temp.begin(); it != temp.end(); it++)
TenCount += *it;
if (TenCount == TwoCount)
return true;
else
return false;
}
int main()
{
int n;
cin >> n;
while (n--)
{
int num;
scanf("%d", &num);
int count = 0;
for (int i = 1; i <= num; i++)
if (isMagic(i))
count++;
cout << count << endl;
}
return 0;
}
本文介绍了一种用于查找神奇数的算法。神奇数是指一个数的二进制表示中所有位的数字之和等于其十进制表示中所有位的数字之和的数。文章详细解释了如何使用bitset库来计算二进制位数之和,并通过迭代分解法计算十进制位数之和,最终判断一个数是否为神奇数。
818

被折叠的 条评论
为什么被折叠?



