解题报告之 幸运数字

来源:互联网 发布:淘宝签到领金币的店铺 编辑:程序博客网 时间:2024/04/27 20:01

Description
4和7是幸运数字,仅由他们构成的数字也是幸运数字。请告诉我第K 个幸运的正整数。

Input
首先是输入测试用例的组数,每组组成如下:一个正整数K (1<= K<= 109).

Output
每行针对每组测试用例输出第K 个幸运的正整数。

Sample Input
3123
Sample Output
4744
/**已知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时后面多减去了个1for(i=0;i<dig;i++)b[i]=false;//将该幸运数字上的各个位初始化为0i=-1;do{if(ord%2)b[++i]=true;elseb[++i]=false;}while((ord/=2));//利用二进制数进位规则得到第k个幸运数字,并将其倒序保存在b数组中。for(i=dig-1;i>=0;i--) //倒序输出if(b[i])putchar('7');elseputchar('4');putchar('\n');}return 0;}




0 0
原创粉丝点击