Mirko 发现了一个正整数 n n n,由于 Mirko 喜欢数字 30 30 30,他想知道用 n n n 的每位数字所组成的数中 30 30 30 的最大倍数。
写一个计算这个数字的程序(如果不存在,则输出 -1)。
一个数 n n n。
仅一行,即题中所求。
30
30
102
210
2931
-1
对于 100 % 100\% 100% 的数据, n n n 的位数不超过 1 0 5 10^5 105。
题目译自 COCI2014-2015 CONTEST #4 T1 CESTA。
首先,如果要使输入的这个数排序后是30的倍数,那么必须满足一下两个条件:
1.这个数至少含有1个0
2.这个数各位之和必须是3的倍数
所以,我们可以把输入的数看做一个字符串,然后一位一位地去找,如果当前这位是0,bo变为1.每次将这一位的数字加入ans里面。最后从大到小排个序输出就可以啦~~
#include
using namespace std;
string s;
int ans;
bool bo;
bool cmp(char x,char y)
{
return x>y;
}
int main()
{
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0')
{
bo=1;
}
ans+=s[i]-'0';
}
if(ans%3!=0||bo==0)//如果不满足任意一个条件
{
cout<<-1;//无解
return 0;
}
sort(s.begin(),s.end(),cmp);//排序
cout<<s;//输出
return 0;
}
结束啦~~~