当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-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

解法一:递推

仔细观察递推过程,会发现

1位2进制:数的个数=1=2^0   f(1)=1

2位2进制:数的个数=2=2^1   f(2)=3=2*f(1)+2^0

3位2进制:数的个数=4=2^2   f(2)=8=2*f(2)+2^1

4位2进制:数的个数=8=2^3   f(2)=8=2*f(3)+2^2……

每一个2进制中1的个数都是在上一个2进制的每个数基础上在最右边加上1或0,所以1的个数先是上一个二进制中个数的二倍,然后如果加1,1的个数会增加,加0不会

#include<stdio.h>
#include<math.h>
int f[21];
void set()
{int i;f[1]=1;for(i=2;i<=20;i++){f[i]=2*f[i-1]+pow(2,i-2);}
}int main(void){int n,val;set();scanf("%d",&n);while(n--){scanf("%d",&val);printf("%d\n",f[val]);}return 0;
}

解法二:用数学公式(讲解摘自老师博客)

该问题的另外一种解法是用组合数学的知识直接计算n二进制数中的1的个数。

  对于输入的n,n二进制数即n位并且首位为1的二进制数,满足:

    pow(2,n-1) ≤ n二进制数 < pow(2,n)

  因为首位为1,n二进制数的个数就是n-1位的0和1的组合数,即pow(2,n-1)个。

  第1位必须为1,所以第1位的1的个数为pow(2,n-1)个。

  其他n-1位,总位数为(n-1)*pow(2,n-1)。其中0和1的个数是一半对一半,所以1的位数为(n-1)*pow(2,n-1)/2。

  合计1的位数为:pow(2,n-1) +(n-1)*pow(2,n-1)/2。

  实际计算时,没有必要用数学函数pow来计算。用移位运算来计算2的n次方是一种快速的计算方法。

即1<<(n-1)+(n-1)*(1<<(n-2))

  解决问题的第一步用数学方法是十分有效的;第二步则需要用一些程序技巧来简化计算。

月之数 HDU2502相关推荐

  1. HDU2502 月之数(解法三)【废除!!!】

    本文废除,参见以下链接. 参考链接:HDU2502 月之数[递推] 月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/ ...

  2. HDU2502 月之数(解法二)【废除!!!】

    本文废除,参见以下链接. 参考链接:HDU2502 月之数[递推] 月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/ ...

  3. HDU2502 月之数【递推】

    月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  4. HDU-2502 月之数 组合数

    月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. HDU 2502 月之数(简单递推)

    月之数 Problem Description 当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数 ...

  6. HDOJ(HDU) 2502 月之数(进制)

    Problem Description 当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数为n(不 ...

  7. Virtual Judge——C - 月之数

    题目介绍 当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数为n(不包含前导0),寒月称它为一个n ...

  8. C/C++ 天之痕,月之数

    题目描述 当陈竟仇还在读大一的时候,他在一本武林秘籍中,发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数为n(不包含前导0),陈竟仇称它为一个n二进制数.所有的n位二进制数中,1的总个数 ...

  9. HDOJ2502月之数

    C语言版 方法一:假设是m二进数,左边第一位确定为1,对剩下的m-1个位置选择1个位置放1,两个位置放1,...到m-1个位置放1(并且对可能的每种情况乘以1的个数). #include <st ...

  10. CCF认证训练行动路线图

    通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...

最新文章

  1. windows xp系统驱动安装问题
  2. 谷歌翻译大型翻车现场:请服用“反坦克导弹”来缓解疼痛,UCLA:医生们要注意了...
  3. 什么是 Change Notification,为什么它很重要(译)
  4. ubuntu spyder 不能输入中文
  5. 如何用postman发送新浪微博
  6. pandas to_csv参数详解_【Python基础】Pandas数据可视化原来也这么厉害
  7. 顶级技术大咖,揭秘实时音视频开发的超级风口
  8. UVA 12101 Prime Path (素数筛+BFS)
  9. Jquery 中 ajaxSubmit使用笔记
  10. 东北大学OJ-1212: 实验3-4 :scanf、printf测试
  11. cad延伸命令怎么用_原来我们都用错了CAD直线命令,你不能忽视的CAD直线绘制技巧详解...
  12. 润乾报表V4在weblogic下部署找不到授权文件的解决方法
  13. 令人发指的关于方法重载和方法重写的一些理解(多态)
  14. 从另一个世界归来的幽灵
  15. 【IEEE期刊专区】这本IEEE旗下期刊中科院升级为1区(TOP),什么来头?(附IEEE在检SCI目录)
  16. 字节跳动张一鸣:“Stay hungry, Stay young”
  17. 微信小程序获取获取群id和群名称
  18. 累涨超200%成华尔街新宠 Fastly借边缘云有望冲上“云”霄?
  19. 建材企业ERP 重在规划(转)
  20. m3u8文件格式讲解,Python解析m3u8文件,并获取在线地址

热门文章

  1. 如何申请注册在国内可以登录使用国外邮箱?
  2. python爬取文献资料_Python 批量爬取Web of Science 文献信息数据
  3. 《计算机工程》投稿过程
  4. php 获取问号后面,php-重写包含问号的URL
  5. SCOI 2016 bzoj 4567~4572 题解
  6. ElasticSearch集群状态异常(Red、Yellow)原因分析
  7. CDM以及ACDM相关的时间、时刻专有词汇说明
  8. Rust use of undeclared crate or module和maybe a missing crate?
  9. 任正非——《一江春水向东流》
  10. 邮件客户端开源_5个最佳开源环境电子邮件客户端