#include<bits/stdc++.h> using namespace std; const int maxn = 10; string s; int sum; int num[maxn] = {0}; int len; string check[7] = {"125", "250", "375", "500", "625", "750", "875"}; void print() { for (int i = 9; i >= 1; i--) { for (int j = 1; j <= num[i]; j++) cout << i; }//输出0以外的数字,倒序输出,保证0不会打头 } void prints() { for(int i = 1;i<=num[0];i++)cout << 0;//输出所有0,放在print后 } void reset(int s,int re) { for(int i = 0;i<=re;i++) { num[check[s][i] - '0']++; } return;//重置被删除数字状态,re是已被更改的位置 } void solve() { for (int i = 0; i < len; i++) { int a = s[i] - '0'; sum += a; num[a]++; } if (sum % 3 != 0) { cout << -1; return; } else { if (!num[5]) { if (num[0] < 3 && num[0] != len)//对000特判 { cout << -1; return; } else { print();prints();//先输出0以外的数 return;//输出后跳出,避免重复输出 } } else { for (int i = 0; i < 7; i++) { string goal = check[i]; bool update = 1;//检验是否有不符合的数字 for (int j = 0; j < 3; j++) { int number = goal[j] - '0'; num[number]--; if (num[number] < 0) { update = 0; reset(i,j);//j是被改变数字在字符串的最后位置 break; } } if (update) { print(); cout << goal;//先输出目标字符串,避免诸如3750,可能输出0375的问题 prints(); break; } } return; } } } int main() { cin >> s;//用字符串,方便处理 len = s.length(); solve(); }
(゚∀゚)牛客小凳又来写题解了,今天的题霸难度稳定,又是模拟,当然涉及一点点的数学。
首先,一个数如果要整除于375,那么一定会整除于3和125,因为3*125 = 375,整除于3很好检验,小学三年级我们就学过,一个数字所有位数的和如果可以被3整除,那么其一定可以被3整除
int a = s[i] - '0'; sum += a; if (sum % 3 != 0) { cout << -1; return; } else { ... }
这里我们用sum表示所有位数的和,对第一行不熟悉的可以去复习一下ASCII编码(´・ω・`),然后检验是否整除3,不是直接输出-1,否则跳转到对于是否整除125的判断
那么如何判断是否整除125呢?我们不妨看看整除125的数有哪些
125,250,375,500,625,750,875,1000,1125,1250,...
我们很容易发现,每过8次,数字的后三位都会循环一次,所以我们知道了,如果要整除125,那么后三位一定满足
string check[7] = {"125", "250", "375", "500", "625", "750", "875"};
这里我对000结尾进行了特判,所以删去了000
然后对7个目标字符串进行搜索,检验可用性,如果都不可以,说明无法整除125,输出-1,否则输出结果
小凳实力浅薄,各路大佬轻喷(,,・ω・,,),有问题欢迎在评论区留言