【数学解法】
由1,2,3,4,5组成的没有重复数字的四位数有A54=120个
以千位为例,在此出现的1,2,3,4,5的几率是均等的,即每个数都出现了120/5=24次。
也就是说,120个数的千位加起来是(1*24+2*24+3*24+4*24+5*24)*1000=15*24*1000
同样的道理,120个数的百位加起来是(1*24+2*24+3*24+4*24+5*24)*100=15*24*100
120个数的十位加起来是(1*24+2*24+3*24+4*24+5*24)*10=15*24*10
120个数的个位加起来是(1*24+2*24+3*24+4*24+5*24)*1=15*24*1
其总和=15*24*1111=399960
【代码解法】
做一个A54的排列,把每个数累计即可。
主类Summary:
package test230429;
import java.util.List;
/**
* 求所有仅由1,2,3,4,5组成的没有重复数字的四位数的和
*/
public class Summary {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4,5};
Arranger arranger2 = new Arranger(numbers, 4);
int sum=0;
for (List<Integer> re : arranger2.getResults()) {
sum+=1000*re.get(0)+100*re.get(1)+10*re.get(2)+1*re.get(3);
}
System.out.println("Sum="+sum);
}
}
辅助类Arranger:
package test230429;
import java.util.ArrayList;
import java.util.List;
/**
* 用于产生排列结果的工具类
* 从n个元素中取出m个元素,按照一定的顺序排成一列。得到所有排列的方案
*/
public class Arranger {
// 保存在内部的对原始元素数组的引用
private int[] arr;
// 总计多少元素,此即数组长度
private final int n;
// 选多少个
private final int m;
// 返回结果
private List<List<Integer>> results;
/**
* 构造函数一
* 这个构造函数是用于全排列的(n=m=数组长度)
*
* @arr 原始元素数组
*/
public Arranger(int[] arr) {
this.arr = arr;
this.n = arr.length;
this.m = arr.length;
this.results = new ArrayList<>();
doArrange(new ArrayList<>());
}
/**
* 构造函数二
* 这个构造函数是用于部分排列的(m<n=数组长度)
*
* @param arr 原始元素数组
* @param selCnt 选多少个
*/
public Arranger(int[] arr, int selCnt) {
this.arr = arr;
this.n = arr.length;
this.m = selCnt;
if (m > n) {
throw new ArrayIndexOutOfBoundsException("m:" + m + " >n:" + n);
}
this.results = new ArrayList<>();
doArrange(new ArrayList<>());
}
/**
* 使用递归进行全排列,结果放在results中
*
* @param initialList 初始链表
*/
private void doArrange(List<Integer> initialList) {
List<Integer> innerList = new ArrayList<>(initialList);
if (m == initialList.size()) {
results.add(innerList);
}
for (int i = 0; i < arr.length; i++) {
if (innerList.contains(arr[i])) {
continue;
}
innerList.add(arr[i]);
doArrange(innerList);
innerList.remove(innerList.size() - 1);
}
}
/**
* 获得结果链表的引用
*
* @return
*/
public List<List<Integer>> getResults() {
return results;
}
// 测试
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4};
Arranger arranger = new Arranger(numbers);
System.out.println("四元素全排列示例:");
int idx = 0;
for (List<Integer> re : arranger.getResults()) {
System.out.println(String.format("%02d", ++idx) + "." + re);
}
Arranger arranger2 = new Arranger(numbers, 2);
System.out.println("\n四选二排列示例:");
idx = 0;
for (List<Integer> re : arranger2.getResults()) {
System.out.println(String.format("%02d", ++idx) + "." + re);
}
}
}
【程序输出】
Sum=399960
两种分析能相互印证。
END
标签:24,arr,230429,四位数,重复,List,re,int,new From: https://blog.51cto.com/u_7726611/6236899