题目:
Problem Description
ztr 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 ztr came across a positive integer n. Help him to find the least super lucky number which is not less than n.
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 ztr came across a positive integer n. Help him to find the least super lucky number which is not less than n.
Input
There are T
(1≤n≤105)
cases
For each cases:
The only line contains a positive integer n(1≤n≤1018) . This number doesn't have leading zeroes.
For each cases:
The only line contains a positive integer n(1≤n≤1018) . This number doesn't have leading zeroes.
Output
For each cases
Output the answer
Output the answer
Sample Input
2 4500 47
Sample Output
4747 47
题解:
超级幸运数字有数量相等的4和7组成,求不小于n的最小幸运数字。
输入一段字符串,字符串长度为n。
当n为奇数时:最小幸运数字必为n+1位数,且该幸运数字最小(n+1=4时:4477)
当n为偶数时:1.大于n位最大幸运数字(4位时:7744),结果是n+2位最小幸运数字(444777)
2.小于n位最大幸运数字,将幸运数字全排列,找到大于该数的最小幸运数字。
还可以枚举0到10的18次方之间所有的超级幸运数字,再用二分搜索解决。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
char a[1005],b[1005];
while(t--)
{
scanf("%s",&a);
int s=strlen(a);
if(s%2!=0)
{
for(int i=0;i<(s+1)/2;i++)
printf("4");
for(int i=(s+1)/2;i<(s+1);i++)
printf("7");
printf("\n");
}
else
{
for(int i=0;i<s/2;i++)
b[i]='4';
for(int i=s/2;i<s;i++)
b[i]='7';
int flag=0;
do
{
if(strcmp(a,b)<=0)
{
for(int i=0;i<s;i++) printf("%c",b[i]);
printf("\n");
flag=1;
break;
}
}
while(next_permutation(b,b+s));
if(flag==0)
{
for(int i=0;i<=s/2;i++)
printf("4");
for(int i=s/2+1;i<=s+1;i++)
printf("7");
printf("\n");
}
}
}
return 0;
}