最大公约数和最小公倍数

描述

输入两个正整数m和n,求其最大公约数和最小公倍数。

输入

两个整数

输出

最大公约数,最小公倍数

输入样例 1 

5 7

输出样例 1

1 35

输入样例 2 

42 48

输出样例 2

6 336

代码一(如下):容易理解

#include 
void gcd(int, int);
void lcm(int, int);
using namespace std;
int main()
{
	int m, n;
	cin >> m >> n;
	gcd(m, n);
	cout << " ";
	lcm(m, n);
	return 0;
}
void gcd(int a, int b)
{
	int i;
	int min;
	int gcd;
	min = (a < b) ? b : a;
	for (i = 1; i <= min; i++)
	{
		if (a % i == 0 && b % i == 0)
		{
			gcd = i;
		}
	}
	cout << gcd;
}
void lcm(int a, int b)
{
	int i;
	int max;
	int lcm;
	max=(a > b) ? a : b;
	for (i = max;; i++)
	{
		if (i % a == 0 && i % b == 0)
		{
			lcm = i; break;
		}
	}
	cout << lcm;
}

代码二(如下):辗转相除法(欧几里德算法)

算法步骤:

1.输入两个正整数m, n(m>n)

2. 计算m除以n的余数r

3.m=n, n=r

4. 若r=0, 则m和n的最大公约数等于n;否则转到第2步

5. 输出最大公约数n

6.最大公倍数=m*n/最大公约数

#include 
using namespace std;
int gcb(int m, int n)
{
	int c = 0;

	while (c = m % n)
	{
		m = n;
		n = c;
	}

	return n;
}
int main()
{
	int m, n;
	while (cin >> m >> n)
	{

		cout << gcb(m, n) << ' ' << m * n / gcb(m, n) << endl;
	}
	return 0;
}

问题点:

while(0)表示不执行语句,while(1)表示执行语句

while ( 0 )
while('\0')
while(a='\0')
上面三种情况等价,因为他们的值都是0。特别是对于 while(a='\0'),while判断的是表达式赋值之后a的值,并不是说赋值成功后返回值为1。

if也是同理。if(a='\0')表示条件不成立,不执行条件语句。

该部分选自CSDN博主「zhjqxy」的原创文章

https://blog.csdn.net/zhjqxy/article/details/52975172
 

你可能感兴趣的:(ACM作业,c++)