hdu-5676 ztr loves lucky numbers(乱搞题)

题目链接:

ztr loves lucky numbers

 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
ztr喜欢幸运数字,他对于幸运数字有两个要求
1:十进制表示法下只包含4、7
2:十进制表示法下4和7的数量相等
比如47,474477就是
而4,744,467则不是

现在ztr想知道最小的但不小于n的幸运数字是多少
输入描述
TT(1T105​​)组数据,每组数据一个正整数n,n<=10^18}1n10​^18​​
输出描述
TT行,每行即答案
输入样例
2
4500
47
输出样例
4747
47


题意

思路

分情况讨论呗;

AC代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=1e5+6;
const LL mod=1e9+7;
const double PI=acos(-1.0);
int a[30],b[30],vis1,vis2;
char s[30];
int check(int x)
{
    for(int i=0;i<x/2;i++)
    {
        if(b[i]<7)return 1;
        else if(b[i]>7)return 0;
    }
    for(int i=x/2;i<x;i++)
    {
        if(b[i]<4)return 1;
        else if(b[i]>4)return 0;
        else continue;
    }
    return 1;
}
void print(int x1,int x2)
{
    for(int i=1;i<=x1;i++)printf("4");
    for(int i=1;i<=x2;i++)printf("7");
}
void print(int type)
{
    if(type==4)printf("4"),vis1--;
    else printf("7"),vis2--;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
       scanf("%s",s);
       if(s[0]<'1'&&s[0]>'9')printf("47");
       else
       {
        int num=strlen(s);
        for(int i=0;i<num;i++)
            b[i]=s[i]-'0';
        if(num&1)
        {
               num++;
               print(num>>1,num>>1);
        }
        else
        {
            if(!check(num))
            {
                num+=2;
                print(num>>1,num>>1);
            }
            else
            {
                vis2=vis1=(num>>1);
                for(int i=0;i<num;i++)
                {
                    if(b[i]>4&&b[i]<7)
                    {
                        print(7);
                        print(vis1,vis2);
                        break;
                    }
                    else if(b[i]==7)print(7);
                    else if(b[i]<4)
                    {
                        if(vis1)
                        {
                            print(4);
                            print(vis1,vis2);
                            break;
                        }
                        else
                        {
                            for(int j=0;j<vis2;j++)printf("7");
                            break;
                        }
                    }
                    else
                    {
                        LL ans1=0,ans2=0;
                        for(int j=0;j<vis2+vis1-1;j++)
                        {
                           if(j<vis2) ans1=ans1*10+7;
                           else ans1=ans1*10+4;
                        }
                        for(int j=i+1;j<num;j++)ans2=ans2*10+b[j];
                        if(ans2<=ans1&&vis1)print(4);
                        else
                        {
                            print(7);
                            print(vis1,vis2);
                            break;
                        }
                    }
                }
            }
        }
        }
printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zhangchengc919/p/5449525.html