有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进行的操作是: 把一个容器灌满; 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸); 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。 问是否能够通过有限次操作,使得水缸最后恰好有C升水。 输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000 ;输出:true表示可以,false表示不可以 。
答案:
//求a、b的最大公约数,若可以被c整除,则输出true,否则输出false
//递归求最大公约数
int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a%b);
}
//非递归求最大公约数
int gcd(int a, int b)
{
int temp;
while(b!=0)/*利用辗除法,直到b为0为止*/
{
temp=a%b;
a=b;
b=temp;
}
return a;
}
bool can(int a, int b, int c)
{
int temp = gcd(a,b);
if (c%temp == 0)
{
return true;
}
return false;
}
附加 求n个数的最大公约数,这里把n个数放在数组中
int gcdN(int arr[], int num)
{
if (1 == num)
return arr[0];
return gcd(arr[num - 1], gcdN(arr, num-1));
}