思路
根据小学数学教科书
我们知道
- 303030的倍数必定是101010的倍数,也是333的倍数;
- 101010的倍数最后一位必定是000,333的倍数各位之和也是333的倍数。
然后再来看数据范围:
对于 100100100% 的数据,nnn 的位数不超过 10510^5105 。
显然这题要用字符串了。
那么怎样使结果最大呢?排序。
排序之后各位之和不变,所以依然是333的倍数,而排序之后000一定在最后,所以依然是101010的倍数。所以排序之后的数也是303030的倍数。
代码
#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;
}
大佬勿喷
该博客讨论了一种算法问题,即如何找出一个数(最多10^5位)的最大303030倍数,前提是这个数必须同时是101010和333的倍数。通过判断数字中是否存在0和各位数字之和是否为3的倍数,然后使用排序来确保0出现在末尾并保持其他条件不变。最终,博主给出了C++代码实现来解决这个问题。
330

被折叠的 条评论
为什么被折叠?



