利用java程序把一个整数拆分成n份,并且可以控制被拆分数字的相差范围(例如:相差在200之内)?
拆分成n份,是范围段,还是n份之和。
调试通过,望采纳
public static void main(String[] args) {
execute(501,502,200);
}
/**
* 拆分
* @param num 拆分的整数
* @param n 拆分的份分数
* @param difValue 每份之间相差最大值
*/
public static void execute(Integer num, Integer n, Integer difValue) {
if (n.equals(1)) {
System.out.println(num);
return ;
}
if (num / n < 1 || difValue < 0) {
System.out.println("无法拆分");
return ;
}
Integer average = num / n;
if (difValue.equals(0) && !num.equals(average * n)) {
System.out.println("无法拆分");
return ;
}
// 可以平均拆分
List<Integer> list = new ArrayList<>();
if (num.equals(average * n)) {
for (int i = 0; i < n; i++) {
list.add(average);
}
System.out.println(JSON.toJSONString(list));
return ;
}
// 不能平均拆分
Integer difference = num - (average * n);
if (difference / n > difValue) {
System.out.println("无法拆分");
return ;
}
// 选其中一种拆分方法
for (int i = 0; i < n; i++) {
if (difference > 0) {
if (difference < difValue) {
list.add(average + difference);
} else {
list.add(average + difValue);
}
} else {
list.add(average);
}
difference -= difValue;
}
// 输出
System.out.println(JSON.toJSONString(list));
}
每次运行之后生成的一组数字要不一样。
比如把10000分成5份,相差范围在100之内
第一次运行:分配的数据列表:[1902.76, 2005.51, 2094.32, 2077.26, 1920.15]。
第二次运行:[2000.34, 1901.03, 2085.26, 2011.76, 2001.61]
快下班摸鱼随手写的
object test {
def main(args: Array[String]): Unit = {
for ( x <- getNum(100,5)) println(x)
}
def getNum(num:Int,n:Int): Array[Int] ={
val arrayBuffer = new ArrayBuffer[Int]()
var tmp = 0
var next = num
var now = 0
for (x <- 1 until n){
tmp = scala.util.Random.nextInt(next)
arrayBuffer.append(tmp)
next -= tmp
now += tmp
}
arrayBuffer.append(num - now)
arrayBuffer.toArray
}
}