辗转相除法
辗转相除法:求最大公约数
两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数(gcd)
gcd(a, b) = gcd(b, a%b) a>b :当b的值变成0的时候,a就是要求的最大公约数
例如:求12和4的最大公约数
a = 12; b = 4;带入到公式中
第一轮之后,第二个位置上的数等于0得出结果,最大公约数是4
题目:输入两个数字,求最大公约数;代码如下:
package Day02_sort;
import java.util.Scanner;
//输入两个数字,求最大公约数
public class pb02 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// a>b gcd(a,b) = gcd(b,a%b)
int a = scan.nextInt();
int b = scan.nextInt();
System.out.println(Fn(a,b));
//-----------循环写法------------
// while(b!=0) {
// int c = a % b;
// a = b;
// b = c;
// }
// System.out.println(a);
}
//----------递归写法----------
public static int Fn(int a, int b) {
if(b == 0) {
return a;
}
int c = a % b;
return Fn(b, c);
}
}
全排列
求全排列:全排列指的是:n个元素中取n个元素(全部元素)的所有排列组合情况。
求组合:n个元素,取m个元素(m < n)的所有组合情况。
求子集:n个元素的所有子集(所有的组合情况)
全排列常用解决办法:邻里交换法和回溯法
回溯法
题目:输入【1,2,3】
输出1,2,3所有的不重复的排列组合
1,2,3 ; 1,3,2
2,1,3 ; 2,3,1
3,1,2 ; 3,2,1
回溯:一般解决搜索问题,全排列也是一种搜索问题。
回溯:就是类似枚举的搜索尝试过程。在搜索过程中寻找问题的解,当发现不满足求解的条件时,就回溯返回,尝试别的路径。
这个怎么理解呢??我就画了一个简单的草图(灵魂画师),如下图:
这就是回溯的原理啦!!
回溯就是所谓的dfs( Depth First Search深度优先算法 )
全排列可以使用回溯的办法列举所有的可能性。一个长度位n的序列,所有的排列组合:n!
1.从集合中选取一个元素(n种情况),并标记该元素已经被使用。
2.在第一步的基础上递归到下一层,从剩余的n-1个元素中,按照第一步的方法再找到一个元素,并标记(n-1种可能)
3.依此类推,所有的元素都被标记,将元素存起来,取对比求解的情况。
题目:2017年Java组C组第三题:
(放代码)
邻里交换法
回溯是试探性填充数据,给每个位置都试探性赋值。
邻里交换,也是通过递归实现,但是是一种基于交换的思路。
步骤:
1. 将数组分成两个部分:暂时确定部分和未确定部分。刚开始都是未确定部分。
2. 在未确定部分中,让每一个数据都有机会和未确定部分中的第一位交换。然后第一位就变成暂时确定部分。依此类推:每个数据都和未确定部分中的第二位交换(第一位数据除外)..........直到确定所有数据。
3. 将确定好的数据和条件对比,对比结束后,还原数据。
这里的代码还没有写好捏┭┮﹏┭┮ 尽情期待吧!