解题报告之 幸运数字

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

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

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 
#include 
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=0;i--) //倒序输出
			if(b[i])
				putchar('7');
			else
				putchar('4');
		putchar('\n');
	}
	return 0;
}




你可能感兴趣的:(解题报告)