2143 - Good Number
时间限制 : 1 秒
内存限制 : 128 MB
这一天Tom看到了自己的女神,觉得自己不应该再堕落了,于是他决定奋发图强,整天泡在图书馆里面。他在图书馆的某一个角落里面发现了一本武林秘籍,收好之后回到宿舍,开始研究这本武林秘籍,其实这本武林秘籍就是一本关于计算机的书,发现了神奇的二进制,如果一个整数m表示成二进制的时候,它的位数是N,Tom把所有N位的二进制数中出现1的总和称为Good Number,例如N=3,共有4个Good Number ,分别是4(100)、5(101)、6(110)、7(111),1的个数是1+2+2+3=8,所以Good Number就是8。
题目输入
第一列输入整数T代表有T组测试数据。
每组测试数据第一行个给你一个N(1<=N<=20)
题目输出
每组测试数据结果占一行,输出给出N位二进制数中的Good Number。
输入/输出样例
输入格式
3 1 2 3
输出格式
1 3 8
C语言解答
#include<stdio.h> #include<math.h> long long jc(int n) { long long result; int i; for(i=1,result=1;i<=n;i++) result*=i; return result; } main() { long long sum; int n,m,i; scanf("%d",&n); while(n--) { scanf("%d",&m); sum=0; for(int i=1;i<=m-1;i++) sum+=(i+1)*(jc(m-1)/(jc(m-1-i)*jc(i))); printf("%lld\n",sum+1); } }
C++解答
#include <stdio.h> int main() { int t , num[22] , base = 1 ,i ,n; scanf("%d",&t); num[1] = 1; for(i = 2 ; i<= 20 ; i++) { num[i] = 2 * num[i - 1] + base ; base <<= 1 ; } while(t--) { scanf("%d",&n); printf("%d\n",num[n]); } return 0; }