Java 将一个数拆分成任意几个数的和(以下代码可否有优化之处求教)
package top.smartprinting;
import java.util.Random;
/** * @author Chief * @date 2019-07-20 16:08 * @Email MyEvery7655@gmail.com */
public class Algorithm {
public static void main(String[] args) {
//第一种:传统的方式
dividingLine("第一种");
splitInto(20, 21);
//第二种:使用数组寄存分解后的数字
dividingLine("第二种");
int[] numberOfSplitsArrays = splitInto(20, new int[22]);
//遍历数组
traversing(numberOfSplitsArrays);
//求数组所有元素的和
summation(numberOfSplitsArrays);
}
/** * 将一个数拆分成任意几个数的和 * * @param number 将要被拆分的数 * @param numberOfSplits 将要被拆分成的数量 */
private static void splitInto(int number, int numberOfSplits) {
Random random = new Random();
int rawData = number;
int temp = 0;
for (int i = 0; i < numberOfSplits - 1; i++) {
if (number > 1) {
int j = random.nextInt(number - 1) + 1;
number -= j;
temp += j;
System.out.println(j);
} else if (temp + 1 == rawData) {
System.out.println(number);
for (int j = 1; j < numberOfSplits - i; j++) {
System.out.println(0);
}
break;
}
}
}
/** * 将一个数拆分成任意几个数的和 * * @param number 将要被拆分的数 * @param numberOfSplits 将要被拆分成的数量的数组 * @return 返回一个数组 */
private static int[] splitInto(int number, int[] numberOfSplits) {
Random random = new Random();
for (int i = 1; i < numberOfSplits.length; i++) {
if (number > 1) {
int j = random.nextInt(number - 1) + 1;
number -= j;
numberOfSplits[i] = j;
} else if (number == 1) {
numberOfSplits[i + 1] = number;
break;
}
}
return numberOfSplits;
}
/** * 遍历数组的结果 * * @param numberOfSplits 被拆分的数字的数组 */
private static void traversing(int[] numberOfSplits) {
System.out.println("遍历数组的结果");
for (int i : numberOfSplits) {
System.out.println(i);
}
}
/** * 求数组所有元素的和【用于验证上面第二种方式的正确性】 * * @param numberOfSplits 被拆分的数字的数组 */
private static void summation(int[] numberOfSplits) {
int temp = 0;
for (int i : numberOfSplits) {
temp += i;
}
System.out.println("\n校验求取数组的所有元素的和为:" + temp);
}
private static void dividingLine(String no) {
System.out.println("\n####################### " + no + " #######################");
}
}