最大公因数的定义
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]
代码实现:
#include<stdio.h>
#define Max 9999
int main()
{
int a[Max],b[Max]={0},c[Max]={0},d[Max]={0},e[Max]={0};
//a[Max]存放本次试验中所需要的所有的质数
//b[Max]存放本次实验中较大数的质数列
int i,j,k,n,m;
int t=1;
int GCF=1;
printf("请输入两个正整数:\n");
//输入两个正整数
scanf("%d%d",&n,&m);
//将数列全部置换成非零
for(i=0;i<Max;i++)
a[i]=t;
//Eratosthenes求较大数的质数列
k=j=0;
if(n>=m){
for(i=2;i<n;i++)
{
if(a[i]!=0)
{
b[k]=i;
k++;
for(j=i+i;j<=n;j+=i)
{
a[j]=0;
}
}
}
}
else{
for(i=2;i<m;i++)
{
if(a[i]!=0)
{
b[k]=i;
k++;
for(j=i+i;j<=m;j+=i)
{
a[j]=0;
}
}
}
}
printf("输出两个整数中稍大数的质数列:\n");
for(i=0;i<k;i++)
{
printf("%d\t",b[i]);
//以十个质因数为一行输出,这段代码可以忽略
if((i+1)%10==0) printf("\n");
}
//求出n的质因数
int n1=n;
k=0;
while(n1!=1)
{
if(n1%b[k]==0)
{
n1=n1/b[k];
c[b[k]]++;//记录质数的次数
}
else
{
k++;//继续检测下一个数是否是n的质数
}
}
printf("\n");
printf("输出n的质因数\n");
for(i=0;i<n;i++)
{
if(c[i]!=0)
printf("质因数:%d 指数:%d\n",i,c[i]);
}
//求出m的质因数
int m1=m;
k=0;
while(m1!=1)
{
if(m1%b[k]==0)
{
m1=m1/b[k];
d[b[k]]++;//记录质数的次数
}
else
{
k++;//继续检测下一个数是否是n的质数
}
}
printf("输出m的质因数\n");
for(i=0;i<m;i++)
{
if(d[i]!=0)
printf("质因数:%d 指数:%d\n",i,d[i]);
}
//找出n和m的相同的质因数以及最少的分解次数
for(i=0;i<Max;i++)
{
if((c[i]!=0)&&(d[i]!=0))
{
//将GCF的值的分解项的次数变成最少
if(c[i]<=d[i]) e[i]=c[i];
else e[i]=d[i];
}
}
//将相同的质因数取下标的最小次数当作指数,并相乘得到最大公因数
printf("\n");
printf("GCF=");
for(i=0;i<Max;i++)
{
if(e[i]!=0)
{
for(j=0;j<e[i];j++)
{
GCF=GCF*i;
printf(" %d *",i);
}
}
}
printf("\n");
printf("最大公因数(GCF)为:%d\n",GCF);
return 0;
}