C 语言问题之 “ 求 a 和 b ”
C 语言问题之 “ 求 a 和 b ”
前期网上看到这样一道题目,着实难为了小编,小编现将此题分享与大家,咱们共同探讨探讨:
已知两个非负整数a,b的和为X,和他们的最小公倍数Y,求这两个数a,b;
样例输入:
10 12
8 0
12 9
样例输出:
4 6
0 8
3 9
问题描述:我们一般常见的都是给定两个正整数,让我们求其最大公约数或者最小公倍数,但是此题给咱们反过来了,如果这作为一道数学题,我相信初中生都可以解决,但如果直接作为编程题,我相信会难倒一大批学生,所以我们现在需要把数学方面的慢慢东西转到编程方面,这也是我们能力的一种提升;好了,废话不多说,咱们直接进入正题,首先,老规矩,咱们先分享一下程序:
#include<stdio.h>
#include<math.h>
int gcd(int a,int b)
{
return (b!=0)?gcd(b,a%b):a;
}
void f(int x,int y,int *a,int *b)
{
y*=gcd(x,y);
*a=(x-sqrt(x*x-4*y))/2;
*b=(x+sqrt(x*x-4*y))/2;
}
int main()
{
int x,y,a,b;
while(scanf("%d%d",&x,&y)!=EOF)
{
f(x,y,&a,&b);
printf("%d %d\n",a,b);
}
return 0;
}
程序运行结果分享如下:
看到这些,很多同学会说这么简单的程序,我早就会了。其实不然,我认为有一部分同学其实还是不见得一定会做出来,假使能做出来,但是我们用的思路会大有不同。
刚开始的时候写这个程序的时候求最大公约数的时候小编用的就是传统的办法,
while(b)
{
t = a%b;
a = b;
b = t;
},
后来看见用递归的办法,一句话就可以代替上述过程,简单明了;
但是解决此问题,我们不得不需要知道数学方面的相关问题:
两整数的乘积=他们的最小公倍数 X 他们的最大公约数
两个非负整数a,b的和X,和他们的最小公倍数Y的最大公约数就是这两个数的最大公约数(这个数学问题比较简单,在此就不予证明了);
其实如果不知道第二个结论的话,要求解这个问题就要用穷举法来解决此问题,小编也尝试利用穷举法解决这个问题,但是写出来代码较为繁琐,在此就不予展示了。其实从这个程序中我们可以学到很多有价值的东西,小编在此就不位大家一一细说了,有问题或者大家有更好的想法,欢迎大家留言分享及批评!