解题报告之 幸运数字
2014-05-13 13:44
274 查看
Description
4和7是幸运数字,仅由他们构成的数字也是幸运数字。请告诉我第K 个幸运的正整数。
Input
首先是输入测试用例的组数,每组组成如下:一个正整数K (1<= K<= 109).
Output
每行针对每组测试用例输出第K 个幸运的正整数。
Sample Input
Sample Output
4和7是幸运数字,仅由他们构成的数字也是幸运数字。请告诉我第K 个幸运的正整数。
Input
首先是输入测试用例的组数,每组组成如下:一个正整数K (1<= K<= 109).
Output
每行针对每组测试用例输出第K 个幸运的正整数。
Sample Input
3 1 2 3
Sample Output
4 7 44
/* *已知4和7为幸运数字,且每一位都由4或7组成的正整数也是幸运数字。 *要求你输出第k个幸运数字。 *幸运数字的规律应该是4,7,44,47,74,77,444,447,474,477,744,747,774,777这样~ *如果把幸运数字中的4换成0,7换成1的话,就可以得到: *0,1,00,01,10,11,000,001,010,011,100,101,110,111 *现在就只需想怎么利用二进制数进位规则较快地得到第k个幸运数字。 *你应该也注意到了,位数只有1位的幸运数字有2个,位数只有2位的有4个,位数只有3位的有8个。 *可以确定的是,位数只有r位的幸运数字有2的r次方个。 *而且由r个0组成的幸运数字是第一个位数有r位的幸运数字。 */ #include <stdio.h> #include <math.h> int main(){ int c; bool b[32]; //用bool型数组来保存幸运数字,TRUE值代表1,FALSE值代表0。 scanf("%d",&c); for(;c--;){ int i,k,sum,dig,ord; scanf("%d",&k); for(i=1,sum=0;k>(sum+=pow(2,i));i++); //计算第k个幸运数字的位数,计算结果保存在i中。 dig=i; //用dig保存i的值。 ord=k-(sum-pow(2,i))-1; //计算第k个幸运数字是位数为dig个的幸运数字中的第几个。 //需要注意的是,因为由dig个0组成的幸运数字与ord=0相对应,所以计算ord时后面多减去了个1 for(i=0;i<dig;i++) b[i]=false; //将该幸运数字上的各个位初始化为0 i=-1; do{ if(ord%2) b[++i]=true; else b[++i]=false; }while((ord/=2)); //利用二进制数进位规则得到第k个幸运数字,并将其倒序保存在b数组中。 for(i=dig-1;i>=0;i--) //倒序输出 if(b[i]) putchar('7'); else putchar('4'); putchar('\n'); } return 0; }
相关文章推荐
- [Scoi2010]幸运数字解题报告
- CodeVS3327 选择数字 解题报告【单调队列优化DP】
- 字符串中数字统计解题报告
- codevs 1394 数字串 贪心 解题报告
- hdu 1172 猜数字 解题报告<暴力枚举>
- 1069,格式化数字解题报告
- 字符串中数字统计解题报告
- 特别的幸运数——解题报告
- 全国信息学奥林匹克联赛(NOIP2010)复赛 1.数字统计 解题报告
- TYVJ 1076 数字三角形2 解题报告
- POJ 2796 数字求和 解题报告
- Leetcode 402. Remove K Digits 删除K个数字 解题报告
- ZZULI 1234 数字串 解题报告
- timus 1658. Sum of Digits URAL 解题报告 DP 数字位数和……
- Leetcode #26. Remove Duplicates from Sorted Array 移除重复数字 解题报告
- BZOJ 大视野 2761: [JLOI2011]不重复数字 解题报告
- 07noip 统计数字 解题报告
- 【LintCode】3.统计数字(Medium)解题报告
- [bzoj2154]crash的数字表格 解题报告
- 【解题报告】HDU 4638 Group - 树状数组 + 求一段区间连续数字的段数