列表

详情


NC229989. 小红的375

描述

小红拿到了一个正整数。她希望你能重排这个正整数的数位,使得它能被 375 整除。你能帮帮她吗?

输入描述

一个正整数,大小不超过 

输出描述

如果无法完成重排,请输出-1。
否则输出任意合法解即可。请注意务必保证输出的数不含前导零,且是375的倍数。输出数的长度、包含的每个数字的出现次数必须和输入的数相等。

示例1

输入:

100002

输出:

120000

说明:

输出201000等答案也是可以通过的。
但012000是不合法的,因为它包含了前导零。输出123000、222000也是不合法的,因为它不是原正整数的重排。输出200100也是不合法的,因为它不是375的倍数。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 232ms, 内存消耗: 7256K, 提交时间: 2022-09-24 15:00:17

s = input()
a = [0 for i in range(10)]
ss = 0
for i in s:
    a[int(i)]+=1
    ss+=int(i)
if ss%3!=0:
    print(-1)
    exit(0)
if a[0]>=3:
    for i in range(9,0,-1):
        print((str)(i)*a[i],end='')
    print('0'*a[0])
    exit(0)
t = 125
while t<1000:
    g = t
    f = True
    while g>0:
        if a[g%10]==0:f = False
        a[g%10]-=1
        g//=10
    if f:
        break
    g = t
    while g>0:
        a[g%10]+=1
        g//=10
    t+=125
if f:
    for i in range(9,0,-1):
        print((str)(i)*a[i],end='')
    print(t,end='')
    print('0'*a[0])
else:print(-1)

C++ 解法, 执行用时: 13ms, 内存消耗: 1044K, 提交时间: 2021-12-07 15:25:29

#include<iostream>
using namespace std;

string a[8]={"500","000","250","750","125","375","625","875"};

int main()
{
	int b[1010];
	string s;
	cin>>s;
	if(s.size()>300000)return -1;
	int sum=0,i,j;
	for(i=0;i<s.size();i++)
	{
		b[s[i]-'0']++;
		sum+=s[i]-'0';
	}
	if(sum%3!=0){cout<<-1;return 0;}
	for(int i=0;i<8;i++)
	{
		for(j=0;j<3;j++)b[a[i][j]-'0']--;
		for(j=0;j<=9;j++)
		{
			if(b[j]<0)break;
		}
		if(j==10)
		{
			for( j=9;j>=0;j--)while(b[j])cout<<j,b[j]--;
			cout<<a[i];
			return 0;
		}
		for(j=0;j<3;j++)
		{
			b[a[i][j]-'0']++;
		}
	}
	cout<<-1;
	return 0;
}

上一题