问题:
设有n个正整数,将它们联接成一排,组成一个最小的多位整数。
程序输入:n个数
程序输出:联接成的多位数
例如:
n=2时,2个整数32,321连接成的最小整数为:32132,
n=4时,4个整数55,31,312, 33 联接成的最小整数为:312313355
解答:
输出:
31231
312313355
BYR 论坛上给出的 “可排序证明”的形式化证明
附:可排序性的证明
题目描述:
比较规则定义:对于任意字符串a,b,如果存在 ab<ba(ab表示a和b连结操作,’<’ 表示字典序大小的比较),那么我们就定义 a 是先序于 b 的。
下面要证明的是,对n个字符串,用上面的规则是可排序的。
证明:
首先,他是可比较的,这个没有疑问。
那么问题就在于,他是不是会出现一个环。如果出现了一个环,那就没办法排序了;如果没有出现环,我们就可以对他进行拓扑排序。
假设,这个比较规则是具有传递性的,也就是说如果 ab<ba && bc<cb 那么,一定存在ac<ca。即 a先序于b,b先序于c,则一定有a先序于c。如果传递性成立,那么就不可能出现环,那么也就证明了这个比较规则是可排序的。
下面来证明传递性 。
重新描述如下:对于任意字符串a,b,c,如果ab<ba且bc<cb。那么一定有ac<ca。
首先,一个字符串可以表达为一个z进制的数。z可以是字母表的大小,比如26,52,62或者128,256。
然后我们定义|a|,|b|,|c|,为字符串a,b,c的长度。
那么,ab = a * z ^ |b| + b , ba = b * z ^ |a| + a
bc = b * z ^ |c| + c , cb = c * z ^ |b| + b
ac = a * z ^ |c| + c , ca = c * z ^ |a| + a
因为字符串ab和ba的长度是一样的,所以ab的字典序小于ba等价于代数上ab<ba 。同理还有bc<cb和ac<ca。
下面就来证明下面的代数推导,ab<ba && bc<cb => ac<ca。
由上面的式子得到:
a * z ^ |b| + b < b * z ^ |a| + a …………………..A
b * z ^ |c| + c < c * z ^ |b| + b …………………..B
化简A: a *(z^|b|-1) < b *(z^|a|-1)
因为 |a|>0, 所以 z^|a|-1 > 0
所以 a * (z ^ |b| - 1) / (z ^ |a| - 1)<b ……………C
同理化简B:b * (z ^ |c| - 1) < c * (z ^ |b| - 1)
B < c * (z ^ |b| - 1) / (z ^ |c| - 1)……………….D
由C,D得: a * (z ^ |b| - 1) / (z ^ |a| - 1) < c * (z ^ |b| - 1) / (z ^ |c| - 1)
于是有: a * (z ^ |c| - 1) < c * (z ^ |a| - 1)
a * z ^ |c| + c < c * z ^ |a| + a
这就得到了ac<ca 。
于是,证明了这个规则的传递性,也就证明了不存在环,即可排序性 。
证毕