《数论与代数的计算性导论》 华南师范大学 王立斌
定理 2.1. 欧几里德算法
给定两个整数 a 和 b,设 a ≥ b,则 a 和 b 的最大公因子等于 b 和 a mod b 的最大公因子。即
gcd(a, b) = gcd(b, a mod b)
其中,a mod b 表示用 a 除以 b 所得到的余数 r。
实现一种批处理版本的GCD算法,即,给定一个整数数组,输出其中所有整数的最大公因子。输入:一个整数数组a;输出:一个整数d,是a数组中所有整数的最大公因子。
C++实现:
(使用visual studio 2019)
此代码通过两个不同的求解gcd的函数,实现支持2个及2个以上的数的公因数求解。
#include<iostream>
using namespace std;
int main()
{
int gcd_batch(int* p, int n);
int gcd_two(int a, int b);
int n;
int* a;
cout << "请输入想要输入的正整数个数\n";
cin >> n;
a = new int[n];
for (int i = 0; i < n; i++)
{
cout << "请输入第" << i + 1 << "个元素\n";
cin >> a[i];
}
int* p = a;
cout << "它们的最大公因数是:";
if (n > 2) cout<<gcd_batch(p, n);
else cout<<gcd_two(*p, *(p+1));
return 0;
}
int gcd_batch(int* p, int n)//求大于2个的数的gcd
{
int sum = 0;
void sort(int* p, int n);
sort(p, n);
while(sum<n-1)
{
sum = 0;
sort(p, n);
int temp = -1, m = -1;
if (*p != 0)
{
m = 0;
temp = *p;
}
for (int i = n ; i > 0; i--)
{
if (*(p + i) != 0)
{
temp = *(p + i);
m = i;
}
}
for (int i =m+1; i < n; i++)
{
*(p + i) = (*(p + i)) % temp;
}
for (int i = 0; i < n ; i++)
{
if (*(p + i) == 0)
sum += 1;
}
}
sort(p, n);
return *(p + n - 1);
}
void sort(int* p,int n)//排序函数
{
for (int i = 0; i < n-1; i++)
{
for(int j=0;j<n-1-i;j++)
if (*(p + j) > *(p + j + 1))
{
int temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
}
}
}
int gcd_two(int a, int b)//求2个数的gcd
{
int temp;
if (b > a)
{
temp = a;
a = b;
b = temp;
}
while (b != 0)
{
temp = b;
b = a % b;
a = temp;
}
return a;
}
测试:
①2个数
②多个数
通过计算可以得到结果正确。