标签:暴力破解 gcd int y% System 相除 break 最大公约数
最大公约数
解法1:暴力破解
思路:
比如16和24,最大公约数可能是16
循环扫描1-16之间,记录最后一次公约数
for (int i = 1; i <= x; i++) {
if(x%i==0&&y%i==0) {
gcd = i;
}
}
=》稍微优化:正着1~x/2
for (int i = 1; i <= x/2; i++) {
if(x%i==0&&y%i==0) {
gcd = i;
}
}
=》再稍微优化从x/2倒着去扫描,x/2~1,逆向扫描次数一定比正着扫小,正着扫一定是x/2次。
for (int i = x/2; i >= 1; i--) {
if(x%i==0&&y%i==0) {
gcd = i;
break;
}
}
适当时机break退出循环才能比x/2次数少。
注意:如果从x/2开始或者结束,要注意一种边界情况,就是这个小数本身就是最大的公约数,下面在算的时候从x/2可能会忽略了这一种情况,所以在一开始的时候就要特别判断一下!
if(y%x == 0) {
System.out.println(x);
System.exit(0);
}
tips:交换x和y,让x最小
if(x>y) {
x=x^y;
y=x^y;
x=x^y;
}
代码:
import java.util.Scanner;
public class 最大公约数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
// 暴力破解
int x = sc.nextInt();
int y = sc.nextInt();
//将x和y重置一下
if(x>y) {
x=x^y;
y=x^y;
x=x^y;
}else if(x==y){
//最大公约数就是x
System.exit(0);
}
int gcd = 1;
//一种边界情况,就是这个小数本身就是最大的公约数,下面在算的时候从x/2可能会忽略了这一种情况
if(y%x == 0) {
System.out.println(x);
System.exit(0);
}
for (int i = 1; i <= x; i++) {
if(x%i==0&&y%i==0) {
gcd = i;
}
}
//略微优化,两个数的最大公约数不会超过x/2
for (int i = 1; i <= x/2; i++) {
if(x%i==0&&y%i==0) {
gcd = i;
}
}
// 再稍微优化从x/2倒着去扫描,x/2~1,逆向扫描次数一定比正着扫小
for (int i = x/2; i >= 1; i--) {
if(x%i==0&&y%i==0) {
gcd = i;
break;
}
}
System.out.println(gcd);
}
}
算法效率:O(n)
解法2:欧几里得算法
思想:
代码:
public static int gcd(int x,int y) {
if(x>y) {
x = x^y;
y = x^y;
x = x^y;
}
while(y%x!=0){
int temp = y%x;
y = x;
x = temp;
gcd(x,y);
}
return x;
}
算法效率:O(log(n))
标签:暴力破解,gcd,int,y%,System,相除,break,最大公约数 来源: https://www.cnblogs.com/MyBlogForRecord/p/14527457.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。