您的位置:首页 > 其它

解题报告之 幸运数字

2014-05-13 13:44 274 查看
Description

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 解题报告 水题