求两个数的最大公约数。
// 方法一
#include <stdio.h>
#include <windows.h>
#pragma warning(disable: 4996)
int GreastCommon(int x, int y)
{
int min = x > y ? y : x; // 找出x ,y 中较小的数。
while (min >1){
if (x % min == 0 && y % min == 0){ // 如果能被同时整除
break; // 此时的min就时最大公约数, 跳出循环,
}
min--; //如果不能被同时整除,自减
}
return min; // 返回min
}
int main()
{
int x = 0;
int y = 0;
printf("请输入两个数值:");
scanf(" %d %d", &x, &y);
int greast = GreastCommon(x, y);
printf("最大公约数为:%d ", greast);
system("pause");
}
//方法二 辗转相减法
/*
假设 x, y 最大公约数为 t , 且 x = n * t , y = m * t
x 和 y 谁大就用大的数减去小的数,并将差值赋值给原本较大的数 ,直到两个数相等为止。
*/
#include <stdio.h>
#include <windows.h>
#pragma warning(disable: 4996)
int GreastCommon(int x, int y)
{
while (1){
if (x > y){
x = x - y; // x > y , 差值赋给 x
}
else if( y > x){
y = y - x; // y > x , 差值赋给 y
}
else{
break; // x y 相等时 ,跳出循环
}
}
return x;
}
int main()
{
int x = 0;
int y = 0;
printf("请输入两个数值:");
scanf(" %d %d", &x, &y);
int greast = GreastCommon(x, y);
printf("最大公约数为:%d ", greast);
system("pause");
return 0 ;
}
//方法三 辗转相除法求最大公约数
/*
假设 x, y 最大公约数为 t
得 ( n * x + m * y ) % t == 0 ,
若 x > y ——————> x / y = z .... n
———————> x = z*y + n
——————> x - z*y = n
——————> ( 1* x + (-1)*y ) % t == 0
*/
#include <stdio.h>
#include <windows.h>
#pragma warning(disable: 4996)
int GreastCommon(int x, int y)
{
// x != 0 && y != 0 , 即当 x 或 y 当中任意一个为0 ,即可得出另一个数为最大公约数 。
while ( x * y != 0){
if (x > y){
x %= y; // x = x % y , 若 得出 x % y 等于0 ,此时 y 为 最大公约数
}
else if (y > x){
y %= x; // y = y % x , 若 得出 y % x 等于0 ,此时 x 为 最大公约数
}
else{ // x == y
return x; // x = y , 此时即得出x 和 y 就为 最大公约数
}
}
return x == 0 ? y : x;
}
int main()
{
int x = 0;
int y = 0;
printf("请输入两个数值:");
scanf(" %d %d", &x, &y);
int greast = GreastCommon(x, y);
printf("最大公约数为:%d ", greast);
system("pause");
}