求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