思路
根据小学数学教科书
我们知道
- 30 30 30的倍数必定是 10 10 10的倍数,也是 3 3 3的倍数;
- 10 10 10的倍数最后一位必定是 0 0 0, 3 3 3的倍数各位之和也是 3 3 3的倍数。
然后再来看数据范围:
对于 100 100 100% 的数据, n n n 的位数不超过 1 0 5 10^5 105 。
显然这题要用字符串了。
那么怎样使结果最大呢?排序。
排序之后各位之和不变,所以依然是
3
3
3的倍数,而排序之后
0
0
0一定在最后,所以依然是
10
10
10的倍数。所以排序之后的数也是
30
30
30的倍数。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char c[100010];
int len,a;
bool flag;
bool cmp(char a,char b)//快排函数,从大到小排
{
return a>b;
}
int main()
{
cin>>c;
len=strlen(c);
for(int i=0;i<len;i++)
{
if(c[i]=='0')//判断是否有0
flag=1;
a+=c[i]-'0';//各位之和
}
if(flag&&a%3==0)//有0且是3的倍数
{
sort(c,c+len,cmp);//STL快排
cout<<c<<endl;
}
else
cout<<-1<<endl;
return 0;
}
大佬勿喷