4-3-2 最大公约数-枚举

求2个数的最大公约数

输入 12 18

输出 6


思路

1变量

a,b,公约数gcd


2算法


思路1(枚举).

土办法:凑数——测试2.3.4.5.6.7.。。12

需要一个变量gcd记录公约数,

一个变量i从2走到12

总共四个变量


路程

1.设i为2;

2.如果a和b能被i整除,记下i

3.i+1重复第二部,直到i等于a或b

4.那么,曾经记下的最大的可以同时整除ab的i是gcd


个人思路:

从12凑到2,第一个可以公约的就是最大公约数,。

import java.util.Scanner;

public class Main {

   public static void main(String[] args) {
      
	   Scanner in = new Scanner(System.in);
	   int a = in.nextInt();
	   int b = in.nextInt();
	   
	   int gongyueshu = 1;
	   int i;
	   
	   if (a < b)
	   {
		   for( i = a ; i >= 1; i--)
		   {
			   if (b % i == 0 && a % i == 0 )
			   {
				   gongyueshu = i;
				   System.out.print(gongyueshu);
				   break;				   
			   }
		   }
		   
	   }
	   else
	   {
		   for( i = b ; i >= 1; i--  )
		   {
			   if (b % i == 0 && a % i == 0 )
			   {
				   gongyueshu = i;
				   System.out.print(gongyueshu);
				   break;				   
			   }			   
		   }
	   }
	   
   }
}


老师的思路:

import java.util.Scanner;

public class Main {

   public static void main(String[] args) {
      
	   Scanner in = new Scanner(System.in);
	   int a = in.nextInt();
	   int b = in.nextInt();
	   
	   int gcd = 1;
	   
	   for ( int i = 2; i <= a && i <= b; i++)
	   {
		   if ( a % i ==  0 && b % i == 0 )
		   {
			   gcd = i;
		   }
	   }
	   System.out.println(a+"和"+b+"的最大公约数是"+gcd);
	   
   }
}

留意:

1.表达或  用: ||


枚举太麻烦,引入——辗转相除法(欧几里得法)


数学上的证明:

首先给定两个数a,b(a>b),则根据除法运算,a/b=q......r。q是商,r是余数。也可以表示为a=bq+r。这是小学就知道的。

下面给出一个定理:
若a=bq+r,则(a,b)=(b,r),即a,b的最大公约数等于b,r的最大公约数。

举个例子来说:
24=10*2+4,那么(24,10)=(10,4)=2

这个定理的证明也很简单。
设c是a和b的任意一个公约数,则c能同时整除a和b,即a=cx,b=cy,(x,y是整数)
将它们代入“a=bq+r”中:
cx=cyq+r
得到r=c(x-yq),说明c也能整除r,即c也是b和r的公约数。
于是a和b的公约数就是b和r的公约数,那么a和b最大公约数就是b和r的最大公约数,(a,b)=(b,r)。
定理得证。

欧几里德算法就是对照这个定理来做的,每一次辗转相除其实就是用了一次上面的定理,一步一步递推得到最后结果。


路程:

1.如果b等于0,计算结束,a是最大公约数

2.否则,计算a除以b的余数,让a=b,而b=余数

3.回到第一步


不清楚有几步,所以不能用for循环

import java.util.Scanner;

public class Main {

   public static void main(String[] args) {
      
	   Scanner in = new Scanner(System.in);
	   int a = in.nextInt();
	   int b = in.nextInt();
	   int oa = a;
	   int ob = b;
	   
	   while (b != 0 )
	   {
		   int r = a % b;
		   a = b;
		   b = r;		   
	   }
	   System.out.println(oa+"和"+ob+"的最大公约数是"+a);
   }
 }


print大法——检测错误:

		   int r = a % b;
		   System.out.println(a+","+b+","+r);
		   a = b;
		   b = r;	

输入12 18

输出

12,18,12

18,12,6

12,6,0

12和18的最大公约数是6




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值