每日刷题(八十四)
1818 最大公约数题目描述
输入两个正整数,求其最大公约数。
详细C++代码1
#include<cstdio>
int gcd(int a, int b)
{
if(b == 0)
return a;
else
return gcd(b, a % b);
}
int main()
{
int m, n;
while(scanf("%d%d", &m, &n) != EOF)
printf("%d\n", gcd(m, n));
return 0;
}
运行结果如下:
按Ctrl + Z然后回车可以跳出EOF循环
C++代码2
#include<bits/stdc++.h>
using namespace std;
int gcd(int a, int b)
{
if(b == 0)
return a;
else
return gcd(b, a % b);
}
int main()
{
int m, n;
while(cin >> m >> n)
cout << gcd(m, n) << endl;
return 0;
}
C++代码3
#include<bits/stdc++.h>
using namespace std;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int m, n;
while(cin >> m >> n)
{
cout << gcd(m, n) << endl;
}
return 0;
}
欧几里得算法基于下面定理:
Attention!!!
0和任意一个整数a的最大公约数都是a
因此我们可以得到
1、递归式:gcd(a, b) = gcd(b, a % b)
2、递归边界:gcd(a, 0) = a
可以写成
int gcd(int a, int b)
{
if(b == 0)
return a;
else
return gcd(b, a % b);
}
更简洁的写法为
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
1984 最大公约数题目描述
读入n个正整数,求出这n个数的最小值、最大值以及它们两的最大公约数,并输出。输入中第一行为n,接下来为n个大于零的整数。
详细C++代码如下:
#include<bits/stdc++.h>
using namespace std;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int n;
while(cin >> n)
{
int a[n];
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
int MAX = a[n - 1];
int MIN = a[0];
cout << MIN << " " << MAX << " " << gcd(MAX, MIN) << endl;
}
return 0;
}
运行结果如下:
2135: 最小公倍数题目描述
给定两个正整数,计算这两个数的最小公倍数。
详细C++代码如下:
#include<bits/stdc++.h>
using namespace std;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b)
{
return a / gcd(a, b) * b;
}
int main()
{
int m, n;
while(cin >> m >> n)
{
cout << lcm(m, n) << endl;
}
return 0;
}
运行结果如下:
问题 A: Least Common Multiple题目描述
The least common multiple (LCM) of a set of positive integers is the smallest positive integer which is divisible by all the numbers in the set. For example, the LCM of 5, 7 and 15 is 105.
#include<bits/stdc++.h>
using namespace std;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b)
{
int d = gcd(a, b);
return a / d * b;
}
int main()
{
int n; //数集行数
while(cin >> n)
{
vector<int> b;
vector< vector<int> > a(n, vector<int>(9));
for(int i = 0; i < n; i++)
{
int m;
cin >> m;
int tmp = 0;
for(int j = 0; j < m; j++)
{
cin >> a[i][j];
if(j == 0)
{
tmp = a[i][0];
}
if(j >= 1)
{
tmp = lcm(tmp, a[i][j]);
}
}
// a[i][m] = tmp;
b.push_back(tmp);
}
for(int i = 0; i < n; i++)
cout << b[i] << endl;
}
return 0;
}
样例运行结果如下:
最小公倍数相关知识要素
最小公倍数求解是建立在最大公约数d基础上,a和b的最小公倍数 = a * b / d
最小公倍数就是上图的并集
由于a * b可能溢出,所以更恰当的写法是 a / d * b
对于三个数求最小公倍数可以运用我们小学学到的知识
求多个最小公倍数方法
可以先求出其中两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。