OJ HDU_2502_月之数

来源:互联网 发布:网络棋牌游戏赚钱吗 编辑:程序博客网 时间:2024/05/17 02:52
/*
http://acm.hdu.edu.cn/showproblem.php?pid=2502


月之数


Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10229    Accepted Submission(s): 5971




Problem Description
当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数。
如果一个正整数m表示成二进制,它的位数为n(不包含前导0),寒月称它为一个n二进制数。所有的n二进制数中,1的总个数被称为n对应的月之数。
例如,3二进制数总共有4个,分别是4(100)、5(101)、6(110)、7(111),他们中1的个数一共是1+2+2+3=8,所以3对应的月之数就是8。




Input
给你一个整数T,表示输入数据的组数,接下来有T行,每行包含一个正整数 n(1<=n<=20)。




Output
对于每个n ,在一行内输出n对应的月之数。




Sample Input
3
1
2
3




Sample Output
1
3
8




Source
《ACM程序设计》短学期考试_软件工程及其他专业




Recommend
lcy
*/
/*
思路:
此题因为限定每个二进制数必须以1开头,所以对于n二进制数:100...0(n-1个0), ... ,111...1(1后面有n-1个1)这么多个数,即从100...0(n-1个0)每次加1直到111...1(n-1个1)。
所以有多少个数,开头就有多少个1(first_1),即1...1(n-1个1,化为十进制)+1个1。(后面的+1表示加上开头的100...0(n-1个0)这个数)
然后从0到first_1-1(减1代表化为1...1(n-1个1))依次转为二进制求其包含的1的数量,最后加上first即为所求。
*/
#include <stdio.h>
#include <math.h>
#define N 30
int numOf1_decimal2binary(int n)
{
int count = 0;
while (n >= 1){
if (n % 2 == 1)
{
count++;
}
n = n / 2;//注意此处为int的除法,没有小数位的
}
return count;
}
void main()
{
int T;
scanf("%d", &T);
int arr_n[N];


for (int i = 0; i < T; i++)
{
scanf("%d", &arr_n[i]);
}
for (int i = 0; i < T; i++)
{
int temp = arr_n[i] - 1;
int result;
int first_1 = 0;//计算所有以1开头的二进制数的数目
for (int j = 0; j < arr_n[i] - 1; j++)
{
first_1 = first_1 + pow(2, j);
}
first_1 = first_1 + 1;
result = first_1;
for (int k = 0; k <= first_1 - 1; k++)
{
result += numOf1_decimal2binary(k);
}
printf("%d\n", result);
}
}
0 0
原创粉丝点击