C - Lucky Numbers (easy)
Posted acgoto
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C - Lucky Numbers (easy)相关的知识,希望对你有一定的参考价值。
Problem description
Petya loves lucky numbers. Everybody knows that positive integers are lucky if their decimal representation doesn‘t contain digits other than 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.
Lucky number is super lucky if it‘s decimal representation contains equal amount of digits 4 and 7. For example, numbers 47, 7744, 474477 are super lucky and 4, 744, 467 are not.
One day Petya came across a positive integer n. Help him to find the least super lucky number which is not less than n.
Input
The only line contains a positive integer n (1?≤?n?≤?109). This number doesn‘t have leading zeroes.
Output
Output the least super lucky number that is more than or equal to n.
Please, do not use the %lld specificator to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams or the %I64d specificator.
Examples
4500
4747
47
47
解题思路:题目要求输出不小于n的最小整数,这个整数要求只含有4和7这两个数字,并且4出现的次数等于7出现的次数。暴力打表(大概2分钟),水过!
打表代码:
1 #include<iostream> 2 using namespace std; 3 typedef long long LL; 4 bool judge(LL x){ 5 int t1 = 0, t2 = 0; 6 while (x){ 7 int a = x % 10; 8 if (a != 4 && a != 7)return false; 9 if (a == 4)t1++; 10 if (a == 7)t2++; 11 x /= 10; 12 } 13 if (t1 == t2)return true; 14 else return false; 15 } 16 int main(){ 17 for (LL i = 47; i < 10000000000; ++i) 18 if (judge(i)){ cout << i << ‘,‘; } 19 return 0; 20 }
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 LL n,obj[]={47,74,4477,4747,4774,7447,7474,7744, 5 444777,447477,447747,447774,474477,474747,474774, 6 477447,477474,477744,744477,744747,744774,747447, 7 747474,747744,774447,774474,774744,777444,44447777, 8 44474777,44477477,44477747,44477774,44744777,44747477, 9 44747747,44747774,44774477,44774747,44774774,44777447, 10 44777474,44777744,47444777,47447477,47447747,47447774, 11 47474477,47474747,47474774,47477447,47477474,47477744, 12 47744477,47744747,47744774,47747447,47747474,47747744, 13 47774447,47774474,47774744,47777444,74444777,74447477, 14 74447747,74447774,74474477,74474747,74474774,74477447, 15 74477474,74477744,74744477,74744747,74744774,74747447, 16 74747474,74747744,74774447,74774474,74774744,74777444, 17 77444477,77444747,77444774,77447447,77447474,77447744, 18 77474447,77474474,77474744,77477444,77744447,77744474, 19 77744744,77747444,77774444,4444477777}; 20 int main(){ 21 cin>>n; 22 for(int i=0;;++i) 23 if(obj[i]>=n){cout<<obj[i]<<endl;break;} 24 return 0; 25 }
再贴另一种很好理解的递归写法(反正我没想到QAQ,不过代码思路真的很溜,值得学习一下,涨一下见识)AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 LL n,ans=1LL <<60; 5 void f(LL x,int y,int z){//通过x构造答案,y是4的个数,z是7点个数 6 if(x>=n && y==z)ans=min(ans,x);//答案ans满足要求:1.大于等于n 2.只存在7和4,且7的个数等于4的个数 7 if(x>n*100)return;//答案肯定在n和n*100之间,所以x>n*100的时候退出; 8 f(x*10+4,y+1,z);//当前答案x加一位数4 9 f(x*10+7,y,z+1);//当前答案x加一位数7 10 } 11 int main(){ 12 cin>>n; 13 f(0,0,0); 14 cout<<ans<<endl; 15 return 0; 16 }
以上是关于C - Lucky Numbers (easy)的主要内容,如果未能解决你的问题,请参考以下文章
leetcode_easy_array1380. Lucky Numbers in a Matrix
codeforces 630C - Lucky Numbers 递推思路