1.题目
输入n个正整数,求它们的最大公因数。
输入格式:
输入2行,第1行一个正整数n(2<=n<=200),表示数的个数
第2行输入n个正整数(1<=正整数<=1e18),用空格分开。
输出格式:
n个数的最大公因数。
输入样例:
在这里给出一组输入。例如:
4
8 12 2000 24
输出样例:
在这里给出相应的输出。例如:
4
2.最大公因数求法(辗转相除法)
任意两个数的最大公因数:使用连除,取余法,即大数除以小数,使除数变为 被除数,余数变为除数,直到余数为0,次时的除数为最大公因数
(1)无递归求两个数的最大公因数
int fun(int u, int v)
{
int t, r;
if(v>u)
{
t = u; u = v; v = t;
}
while ((r = u % v) != 0)
{
u = v; v = r;
}
return v;
}
(2)用递归求两个数的最大公因数
int fun(int n, int m)
{
if (m == 0)
{
return n;
}
return fun(m, n % m);
}
(3)用递归求N个数的最大公因数
在(2)的基础上做以下改进:
for (i = 1; i < n; i++)
{
ans = fun(ans, a[i]);
}
3.代码
#include <stdio.h>
long long int fun(long long int n, long long int m)//根据题中数据的范围用long long int
{
long long int t;
if (n < m)
{
t = n; n = m; m = t;
}
return m == 0 ? n: fun(m, n % m);//用条件运算符做简化
}
int main()
{
int n = 0;
long long int a[201] = { 0 };
scanf("%d", &n);
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%lld", &a[i]);
}
long long int ans = a[0];
for (i = 1; i < n; i++)
{
ans = fun(ans, a[i]);//两个数求出最大公因数,再与后面的数去求最大公因数
}
printf("%lld", ans);
return 0;
}
如果还有可改进之处,欢迎留言评论哦😊😊