public class Main { public static void main(String[] args) { int a[]={1,2,3,4,5,6,7,8,9}; dfs(0,a); } //全排列算法 public static void dfs(int dept,int a[]) { if (dept==9) { //看了其他的题解后得到一个关键点: //"等号左边只能为4位数,等号右边为5位数,且 x号 左边只能为2位数(3位数结果重复)" //通过结论去推断原因,可能是这样: //当右边为4位数,最大可得结果为 7448=98*76,因为最大是数已经不满足9位数了,那么其他的结果必然都小于9位数,所以右边不能为4位数。 //当右边为5为数,最大结果为74970=98*765,最小为2345=1*2345,满足题目要求的结果就在这范围内。 //当右边为6位数使,最大结果为645498=987*654,最小为23456=1*23456,皆不满足要求(位数超限)。 //那么,当右边为5位数时会有怎样的 情况呢? //因为等号右边为5位数,所以左边为4位数。 //当等号右边为5位数,可能的情况有 : //*X*** || **X*** || ***X** || ***X* (*表示位数) //由于题目说明 乘数交换被认为是相同的,所以去除后两种情况。 //System.out.println(Arrays.toString(a)); int result=a[0]*1000+a[1]*100+a[2]*10+a[3];//根据数组拼接数字 int num1=a[4]; int num2=a[5]*1000+a[6]*100+a[7]*10+a[8]; if(num1*num2==result) { System.out.printf("%d = %d x %d\n",result,num1,num2); } num1=a[4]*10+a[5]; num2=a[6]*100+a[7]*10+a[8]; if(num1*num2==result) { System.out.printf("%d = %d x %d\n",result,num1,num2); } return; } for (int i = dept; i <9; i++) { swap(i,dept,a); dfs(dept+1,a); swap(dept,i,a); } return ; } //交换下标x与y的值 public static void swap(int x,int y,int []a) { int t=a[x]; a[x]=a[y]; a[y]=t; } }
解题思路:
注意事项:
参考代码:
0.0分
0 人评分
母牛的故事 (C语言代码)浏览:480 |
大神老白 (C语言代码)浏览:696 |
简单的a+b (C语言代码)浏览:641 |
C语言训练-求1+2!+3!+...+N!的和 (C语言代码)浏览:824 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:593 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:612 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:331 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:751 |
简单的a+b (C语言代码)浏览:473 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:750 |