在下面的数中间填上“+”,“-”,使计算结果为100。 123456789=100 。
2015-09-16 14:28
246 查看
递归里面还有递归 , 三个[b]递归嵌套解决奥数题 : 在下面的数中间填上“+”,“-”,使计算结果为100。 123456789=100 。[/b]
个人表达能力不是很好 所以只能写点简单的分析。
简单的思路分析: 可以在9个数字([b]123456789)之间插入的符号个数最多为8个,符号放置的位置只能从一取到八,而且不能有两个符号及两个以上的符号位置重复,且在不考虑符号为加或减的情况下(例如符号的位置为三,五,七 与 七 ,五 ,三 视为同种情况),有N个符号(N<=8),则 第n个符号所在的位置必须大于第n-1位符号所在的位置,然后再考虑符号是加是减。[/b]
例如:
第一步,先考虑符号的个数: 为2的情况
第二步,考虑符号的位置: (一二),(一三),(一四),[b](一五),(一六),(一七),(一八), // (使用N叉数)[/b]
[b] (二三),(二四),(二五),(二六),(二七),(二八),[/b]
[b] (三四),[b](三五),(三六),(三七),(三八),[/b][/b]
[b][b] ....................................................[/b][/b]
[b][b]第三步,再考虑符号为加或为减: 以符号位置为(一二)的情况举例 1+2+3456789 1+2-3456789 1-2+3456789 1-2-3456789 ; //(使用二叉树)[/b][/b]
</pre></p><p></p><p><strong></strong></p><p><strong><span id="_xhe_cursor"></span></strong><pre class="java" name="code">
运行结果如下:
123-45-67+89=100
123-45-67+89=100
123-45-67+89=100
123+4-5+67-89=100
123+45-67+8-9=100
123+4-5+67-89=100
123+45-67+8-9=100
123+4-5+67-89=100
123+45-67+8-9=100
123+4-5+67-89=100
123+45-67+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
个人表达能力不是很好 所以只能写点简单的分析。
简单的思路分析: 可以在9个数字([b]123456789)之间插入的符号个数最多为8个,符号放置的位置只能从一取到八,而且不能有两个符号及两个以上的符号位置重复,且在不考虑符号为加或减的情况下(例如符号的位置为三,五,七 与 七 ,五 ,三 视为同种情况),有N个符号(N<=8),则 第n个符号所在的位置必须大于第n-1位符号所在的位置,然后再考虑符号是加是减。[/b]
例如:
第一步,先考虑符号的个数: 为2的情况
第二步,考虑符号的位置: (一二),(一三),(一四),[b](一五),(一六),(一七),(一八), // (使用N叉数)[/b]
[b] (二三),(二四),(二五),(二六),(二七),(二八),[/b]
[b] (三四),[b](三五),(三六),(三七),(三八),[/b][/b]
[b][b] ....................................................[/b][/b]
[b][b]第三步,再考虑符号为加或为减: 以符号位置为(一二)的情况举例 1+2+3456789 1+2-3456789 1-2+3456789 1-2-3456789 ; //(使用二叉树)[/b][/b]
1 | 一 | 2 | 二 | 3 | 三 | 4 | 四 | 5 | 五 | 6 | 六 | 7 | 七 | 8 | 八 | 9 |
<strong>public class aoShuJiaJian_QiuHe</strong> { public static void print(int[] oi, int[] sub_array,int[] xy,int jieguo)//输出结果 { System.out.print(sub_array[0]); for (int i = 1; i <sub_array.length; i++) { if (oi[i - 1] == 0) { System.out.print("+" + sub_array[i]); } else { System.out.print("-" + sub_array[i]); } } System.out.print("="+jieguo); System.out.println(); //for(int i=0;i<n;i++) //输出符号的位置 //{ // System.out.print(xy[i]+" "); //} //System.out.println(); return ; } public static void jiSuan_jieguo(int n, int[] oi, int[] sub_array, int[] xy) //计算结果 { int qiuhe = sub_array[0]; for (int i = 1; i < sub_array.length; i++) { if (oi[i - 1] == 0) //0为加,1为减 0-1变量 { qiuhe = qiuhe + sub_array[i ]; } else { qiuhe = qiuhe - sub_array[i ]; } } if (qiuhe == 100) { print(oi, sub_array, xy,qiuhe); //结果等于100输出 return; } return; } public static void jiSuan_even(int[] array, int n, int[] xy, int[] oi) //计算被符号分割的各各数 例如符号个数为3 符号位为3,5,7 则被符号分割的数为123,45,67,89 { //array 要计算的数组 n为符号个数 xy保存的是符号的位置 oi保存的是加减符号 int[] sub_array = new int[n + 1]; //保存被符号分割的数 符号若为N个 则被符号分割的数的个数为N+1个 for (int i = 0; i < n + 1; i++) { if (i == 0) { for (int j = 0; j < xy[i]; j++) //例如xy[i]=3 则sub_array[i]=1*100+2*10+3*1 { int temp = 1; for (int cifang = xy[i] - j; cifang > 1; cifang--) // cifang意为 次方 { temp = temp * 10; } sub_array[i] = sub_array[i] + array[j] * temp; } } else if (i > 0 && i < n) { for (int j = xy[i - 1]; j < xy[i]; j++) { int temp = 1; for (int cifang = xy[i] - j; cifang > 1; cifang--) { temp = temp * 10; } sub_array[i] = sub_array[i] + array[j] * temp; } } else { for (int j = xy[i - 1]; j < array.length; j++) { int temp = 1; for (int cifang = array.length - j; cifang > 1; cifang--) { temp = temp * 10; } sub_array[i] = sub_array[i] + array[j] * temp; } } } jiSuan_jieguo(n, oi, sub_array, xy); //计算结果 } /////////////////////////////////////////<img src="https://img-blog.csdn.net/20150916142947157?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />///////////////////////////////////////////////////////////////////////////////////// public static void fuhao_oi_(int[] array, int n, int[] xy, int[] oi, int i) //第三个递归 用来确定加减号 { if (i == n) { jiSuan_even(array, n, xy, oi); return; } for (int k = 0; k <= 1; k++) //二叉树 0为加 1为减 { oi[i] = k; fuhao_oi_(array, n, xy, oi, i + 1); } } //////////////////////////////////////////////////////////////////////////////////////////////////////// public static void fuhaoxy(int[] array, int n, int[] xy, int index)//第二个递归 确定符号位置 { if (index == n) { if (n == 1 && xy[index - 1] > 8) { return; } for (int j = n - 1; j >= 1; j--) //符号位置不能重合 不要出现重复 { if (xy[j] - xy[j - 1] <= 0 bcbc ) { return; } } int[] oi = new int ; //oi数组 保存符号 fuhao_oi_(array, n, xy, oi, 0); return; } for (int i = 1; i <= 8; i++) { xy[index] = i; fuhaoxy(array, n, xy, index + 1); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static void fuhaosum(int[] array, int n)//第一个递归 确定符号的个数。 { if (n > 8) { return; } int[] xy = new int ; for (int i = 1; i <= n; i++) { xy[i - 1] = i; fuhaoxy(array, n, xy, 0); } fuhaosum(array, n + 1); } public static void main(String[] args) { int[] array = new int[9]; for (int i = 1; i <= 9; i++) { array[i - 1] = i; } fuhaosum(array, 1); } }
运行结果如下:
123-45-67+89=100
123-45-67+89=100
123-45-67+89=100
123+4-5+67-89=100
123+45-67+8-9=100
123+4-5+67-89=100
123+45-67+8-9=100
123+4-5+67-89=100
123+45-67+8-9=100
123+4-5+67-89=100
123+45-67+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+34-5+67-8+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
12+3+4+5-6-7+89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
123-4-5-6-7+8-9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
1+2+3-4+5+6+78+9=100
相关文章推荐
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例
- Java中的递归详解(用递归实现99乘法表来讲解)
- C语言的递归思想实例分析
- php通过递归方式复制目录和子目录的方法
- php递归法读取目录及文件的方法
- php实现递归与无限分类的方法