题目描述
这是一道简单的数学题,简单到题目只给你一个正整数N,而你则输出一个M,这个M是由N的各个位数重新排列而来的(比如,N=123,则M可以为123,213,321,312,132,231)。由于M有许多许多,所以要求你输出一个满足
∣
N
−
M
∣
%
9
=
0
|N-M|\%9=0
∣N−M∣%9=0 的最小M。
A
%
9
A \% 9
A%9 = 0的含义为 A是9的倍数,比如9,18,0,9999等。
Standard Input
一个正整数N (
1
<
N
<
1
0
1000
1< N < 10^{1000}
1<N<101000)保证N的每一位都不是0。
注意:因为N实在太大请使用至少1001位的char数组保存而非int保存N
Standard Output
一个正整数M,如题目要求的那样。
思路
由于数非常大,所以用字符串数组的形式来存储,而满足9的倍数的数每一位数字的和一定是9的倍数,所以OJ给的数据一定是满足题意的。那么重排列后谁是最小9的倍数呢?
设
一
个
三
位
数
的
三
个
数
分
别
是
i
,
j
,
k
,
设一个三位数的三个数分别是i,j,k,
设一个三位数的三个数分别是i,j,k,
则
a
=
100
i
+
10
j
+
k
,
a
′
=
100
k
+
10
i
+
j
,
δ
a
=
a
′
−
a
=
99
k
−
90
i
−
9
i
=
9
t
(
t
∈
Z
)
.
则a=100i+10j+k,a'=100k+10i+j,\delta a=a'-a=99k-90i-9i=9t(t\in Z).
则a=100i+10j+k,a′=100k+10i+j,δa=a′−a=99k−90i−9i=9t(t∈Z).
其
中
,
(
i
+
j
+
k
)
%
9
=
=
0
其中,(i+j+k)\%9==0
其中,(i+j+k)%9==0
重
排
列
也
是
满
足
这
个
条
件
的
,
所
以
a
和
a
′
是
9
的
倍
数
是
肯
定
的
,
通
过
作
差
发
现
,
两
个
数
相
减
同
样
也
可
以
被
9
整
除
重排列也是满足这个条件的,所以a和a'是9的倍数是肯定的,通过作差发现,两个数相减同样也可以被9整除
重排列也是满足这个条件的,所以a和a′是9的倍数是肯定的,通过作差发现,两个数相减同样也可以被9整除
那
么
,
a
−
δ
a
=
a
′
这
样
的
a
′
也
就
满
足
条
件
。
考
虑
最
小
排
列
数
,
同
样
满
足
这
规
律
那么,a-\delta a=a'这样的a'也就满足条件。考虑最小排列数,同样满足这规律
那么,a−δa=a′这样的a′也就满足条件。考虑最小排列数,同样满足这规律
通过分析知道,这道题我们要求的结果也就是最小排列数!代码也就很简单了…
#include<bits/stdc++.h>
#define N 1001
using namespace std;
int main(){
string s;
int a[N];
cin>>s;
int len=s.length();
for(int i=0;i<len;i++){
a[i]=s[i]-'0';
}
sort(a,a+len);
for(int i=0;i<len;i++){
cout<<a[i];
}
cout<<endl;
}