题目大意
各个位只含4和7的数(比如74777,47,4444),要求各位之和等于n。求其中最小的那个。如果不存在,则输出“YingYingYing”。
题目思考
贪心:7的个数越多越好,因为这样位数少,即越优。此题肯定不能用int,long long 才存,所以只能借助字符串。
我们先求 最多需要多少个7,cnt7=n/7;
然后对n取余7,这样余数只能在0~6中,根据余数的不同,需要拆解几个7。
什么意思? 假设对于 余数==3的情况,3+3*7=24是4的倍数,需要拆解3个7,这样这部分可以保证被4整除,即可以用6个4来填充。对应case 3的情况
#include<bits/stdc++.h>
using namespace std;
int n,cnt4=0,cnt7=0;
int main(){
cin>>n;
cnt7=n/7;//统计7的个数
int res=n%7;
switch(res){
case 0: break;
case 1:cnt7--;cnt4+=2;break;
case 2:cnt7-=2;cnt4+=4;break;
case 3:cnt7-=3;cnt4+=6;break;
case 4:cnt4++;break;
case 5:cnt7-=1;cnt4+=3;break;
case 6:cnt7-=2;cnt4+=5;break;
}
if(cnt7<0) cout<<"YingYingYing";
else{
for(int i=1;i<=cnt4;i++) cout<<"4";
for(int i=1;i<=cnt7;i++) cout<<"7";
}
}