hdu-5676 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(1≤T≤105)组数据,每组数据一个正整数n,n<=10^18}1≤n≤10^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("\n"); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步