题目:
写一个程序,求两个正数的最大公约数。如1100100210001,120200021,求其最大公约数
分析:设两个数分别为x,y
求其最大公约数f(x,y),如果有x%2==0而y%2不等于0,那么可以
约简为f(x/2,y),同样道理适用于y
如果x与y都是偶数,那么最大公约数可以为f(x/2,y/2)*2
如果x与y都是奇数,那么最大公约数可以为f(y,x-y)
写一个程序,求两个正数的最大公约数。如1100100210001,120200021,求其最大公约数
分析:设两个数分别为x,y
求其最大公约数f(x,y),如果有x%2==0而y%2不等于0,那么可以
约简为f(x/2,y),同样道理适用于y
如果x与y都是偶数,那么最大公约数可以为f(x/2,y/2)*2
如果x与y都是奇数,那么最大公约数可以为f(y,x-y)
直到上述x-y为0,即为最大公约数
#include<iostream>
using namespace std;
//判断一个数是否偶数
int isEven(int x)
{
return (x % 2 == 0)? 1 : 0;
}
int maxCommonDivisor(int x, int y)
{
//如果x<y交换下位置
if (x < y)
return maxCommonDivisor(y, x);
else if (y == 0)
return x;
else
{
//如果x是偶数,y不是偶数
if (isEven(x))
{
//如果x是偶数y也是偶数,x和y都除2
if (isEven(y))
return (maxCommonDivisor(x >> 1, y >> 1) << 1);
//如果y不是偶数,则只有x除2
else
return maxCommonDivisor(x >> 1, y );
}
else
{
//如果y是偶数,则只有y除2
if (isEven(y))
return maxCommonDivisor(x, y >> 1);
//如果x和y都不是偶数,则相减
else
return maxCommonDivisor(y, x - y);
}
}
}
int main()
{
int x = 30, y = 42;
int commonDivisor = maxCommonDivisor(x, y);
cout << commonDivisor << endl;
system("pause");
return 0;
}