1214: 幸运数字
Description
4和7是幸运数字,仅由他们构成的数字也是幸运数字。请告诉我第K 个幸运的正整数。
Input
首先是输入测试用例的组数,每组组成如下:一个正整数K (1<= K<= 10
9).
Output
每行针对每组测试用例输出第K 个幸运的正整数。
Sample Input
3 1 2 3
Sample Output
4 7 44
这题的意思简洁明了,就是让你求出第n位4和7组成的数;
自己打一下草稿就能看出规律
1 4
2 7 2
3 44
4 47
5 74
6 77 4
7 444
8 447
9 474
10 477
11 744
12 747
13 774
14 777 8
。。。。。。。。。。。。。。。
从仅写的这几行就能看出规律,第一位个位数,他的周期是2,数字是4 7
第二位十位,他的周期是4,数字是4 4 7 7
第三位百位,他的周期是8,数字是4 4 4 4 7 7 7 7
~~~~~~~~~~~~~~~~~~~~~~
依次类推。。。(而且每个周期的前半部分是4,后半部分是7,我们可以通过取模的办法来实现)
假设我们要求第十位幸运数
输入10
首先我们就能求出个位数 10%(2^1)=0~~~~~~~~~~~为7
然后十位数 (第二位数是从第三个数才开始有的)所以(10-2)%(2^2)=0~~~~~~为7
然后百位数 (第三位数是从第七个数开始有的)所以(10-2-4)%(2^3)=4~~~~~~为4
找到规律之后一切都是so easy
#include<iostream> #include<cmath> using namespace std; int s[100]; int main() { int t,m,i,j,c,f,d; cin>>t; while(t--) { int sum=0; cin>>m; for(i=1;sum<m; i++) { f=(int)pow((double)2,(double)i); sum+=f; d=sum-f; c=m-d; if(c%f<=f/2&&c%f!=0) s[i]=4; else s[i]=7; } for(j=i-1;j>=1;j--) cout<<s[j]; cout<<endl; } return 0; }![]()