数值排序问题 - 超大数比较
问题
文本a.txt中有20行随机产生的数列,如下:
2928326128601232462131283250710027308938740594716691200992050511576
5352129649530193383124730478244772348721985707222557212265817305
217141333532296179938475175265792931789219830308392472584606305
2371620291160322081050531817416284225477019123161801285941026814244
283929972304551060318886921731765136928849135391662294051194618754
1809165929787147057932949630411324311737224509104016550662932273
27396236084901303873154718299242931819623155304661177528921164510335
254221462410491137971033914630292752245114969186002809930190939425
1085287492160525651862932475207612387312368408826675135332406418337
2567810118246621010283281198810903279355871571118961177731143829148
23727111515524141721964179351992331180134926914198081871053303186
378579502856625703213542353218420835730692264021219729654278515442
30215186011014395001656818458819061824708536511543271701327524725
223702764213159156022932717903282522044350522584222768193271431422354
3079720530119542370417125702274761144023302102641160114921224469221
15642298214000242538839193816839550322381321993212316517861828002
13042178002978222022331319116624809338275899045263351248023569
11252165681825711849278422768716060438517976169102391532289954712000
105084292396529699311371735329685626410510259482788519645152723476
29674179062831103792824121564178225289202161443911094228581583531951
要求
通过纯批处理按照数列的大小顺序,正序输出如下
PS:每行的数值都远远超过了cmd所能计算的最大数值。
13042178002978222022331319116624809338275899045263351248023569
217141333532296179938475175265792931789219830308392472584606305
1809165929787147057932949630411324311737224509104016550662932273
5352129649530193383124730478244772348721985707222557212265817305
15642298214000242538839193816839550322381321993212316517861828002
23727111515524141721964179351992331180134926914198081871053303186
30215186011014395001656818458819061824708536511543271701327524725
105084292396529699311371735329685626410510259482788519645152723476
254221462410491137971033914630292752245114969186002809930190939425
283929972304551060318886921731765136928849135391662294051194618754
378579502856625703213542353218420835730692264021219729654278515442
1085287492160525651862932475207612387312368408826675135332406418337
2371620291160322081050531817416284225477019123161801285941026814244
2567810118246621010283281198810903279355871571118961177731143829148
2928326128601232462131283250710027308938740594716691200992050511576
3079720530119542370417125702274761144023302102641160114921224469221
11252165681825711849278422768716060438517976169102391532289954712000
27396236084901303873154718299242931819623155304661177528921164510335
29674179062831103792824121564178225289202161443911094228581583531951
223702764213159156022932717903282522044350522584222768193271431422354
编写代码
编写一个比较大数的函数,创建文件
compare.sh
#! /bin/bash
## 比较两个数大小
##
## 返回值
##
## 1 第一个数字大于第二个数字
## 0 第一个数字等于第二个数字
## -1 第一个数字小于第二个数字
function compare()
{
str1=$1
str2=$2
param=$#
## 这里不做判断是否为数字处理
flag=
if [ ${param} -ne 2 ]
then
echo "参数个数: ${param},不为2,不能计算,请核实"
exit
fi
## 比较两个数字位数,位数大则数字大
len1=${#str1}
len2=${#str2}
if [ ${len1} -gt ${len2} ]
then
flag=1
elif [ ${len1} -lt ${len2} ]
then
flag=-1
else
## 两个数字位数一样,依次比较两个数各个位大小
i=0
while [ ${i} -lt ${len1} ]
do
c1=${str1:${i}:1}
c2=${str2:${i}:1}
if [ ${c1} -gt ${c2} ]
then
flag=1
break
elif [ ${c1} -lt ${c2} ]
then
flag=-1
break
else
flag=0
fi
let i++
done
fi
echo ${flag}
}
排序文件
run.sh
#! /bin/bash
## 引入其他文件 - 使用 compare 函数
. ./compare.sh
file=./a.txt
## 将文件转化为一维数组
i=0
while read line
do
lines[${i}]=${line}
let i++
done < ${file}
## 一位数组个数
len=${#lines[*]}
## 使用简单选择排序
i=0
while [ ${i} -lt ${len} ]
do
index=${i}
minindex=${i}
let j=${i}+1
while [ ${j} -lt ${len} ]
do
## if [ ${lines[${index}]} -gt ${line[${j}]} ] 特大数字不能直接参与运算,使用我们自定义函数
ret=`compare ${lines[${minindex}]} ${lines[${j}]}`
if [ ${ret} -eq 1 ]
then
minindex=${j}
fi
let j++
done
## 交换index与minindex的值
tmp=${lines[${index}]}
lines[${index}]=${lines[${minindex}]}
lines[${minindex}]=${tmp}
let i++
done
##输出
i=0
while [ ${i} -lt ${len} ]
do
echo ${lines[${i}]}
let i++
done