本文介绍使用shell实现将一个整数m随机分解为n个数。
要求:
- 将一个整数m分解为n个随机数,n个随机数之和要等于m
- 指定随机数的最小值
分析:
这与leetcode上的两道题类似:
343. 整数拆分
剑指 Offer 14- I. 剪绳子
下面来介绍一种思路:
- 随机抽取
n-1
个区间为(0, m)
的数,得到数组a
- 将
0
和m
加入数组a
中
- 对数组
a
进行升序排序
- 按顺序计算数组
a
中相邻元素的差值:后一个元素减去前一个元素。差值组成的数组就是我们要的结果。
shell脚本SplitInteger.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #!/bin/bash
SplitInteger() { let SIZE_BYTES=$SIZE_BYTES-$NUMBER*$minNum declare -a num_list num_list[0]=0 num_list[1]=$SIZE_BYTES let num=$NUMBER for i in $(seq 2 $num); do random_rate=`echo "scale=4 ; ${RANDOM}/32767" | bc -l` random_bytes=`echo "$SIZE_BYTES*$random_rate" | bc` num_list[$i]=`echo $random_bytes | xargs printf "%.*f\n" 0` done
num_length=${#num_list[*]} BubbleSort
let rand_len=$num_length-2 for i in $(seq 0 $rand_len); do new_list[$i]=`echo "${num_list[$(( i+1 ))]}-${num_list[$i]}+$minNum" | bc` done
echo "${new_list[*]}"
sum=0 for (( i=0;i<${#new_list[*]};i++ )) do let sum=sum+${new_list[$i]} done
echo $sum
}
let SIZE_BYTES=100 let NUMBER=10 let minNum=5 SplitInteger exit 0
|
执行:
1 2 3
| $ sh SplitInteger.sh 8 12 6 16 9 12 11 9 5 12 100
|
BubbleSort
为冒泡排序方法,具体实现参考Linux Bash编程:字符串处理。
--THE END--
v1.4.14