题目:
求两个数的最大公约数
这道题,首先,需要至少什么是约数?
它是指:约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。在大学之前,”约数”一词所指的一般只限于正约数。约数和倍数都是二元关系的概念,不能孤立地说某个整数是约数或倍数。一个整数的约数是有限的。同时,它可以在特定情况下成为公约数。
其实,需要知道什么是公约数?
它是指:公约数,亦称“公因数”。它是几个整数同时均能整除的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数(H.C.M. / G.C.D.) 求两个数最大公约数的方法 倍数关系 若较大数是较小数的倍数,那么较小数就是这两个数的最大公约数。 互质关系 若这两个数是互质数,那么它们的最大公约数就是1.
最后,需要就是我们的设计思路。
设计思路:
方法一:
我们可以采用学生(阙正仁)完成的方法,直接将每一个数的约数都找出来,然后在比较这个两个数的约数,取其最大的公约数,即可完成题目要求。
代码如下:
#include<stdio.h>
void main()
{
int que(int k,int j);//函数定义
int k,j,v;
printf("请输入两个数:");
scanf("%d%d",&k,&j);
v=que(k,j);
printf("\n最大公约数为:%d\n",v);
}
int que(int k,int j)
{
int i,n,temp,a[50],b[50],d[50];//a[]存放第一个数约数 b[]存放第二个数约数 d[]存放公共约数
int t=0; //关于a[]
int c=0; //关于b[]
int f=0; //关于d[]
int u=0; //用于比较取最大约数
//求出两个数的约数
for(i=1;i<=j;i++)
{
if(j%i==0)
{
a[t]=i;//存在a[]
t++;
}
}
printf("%d的约数为:",j);
for(i=0;i<t;i++)
{
printf("%d ",a[i]);//输出a约数
}
for(i=1;i<=k;i++)
{
if(0==k%i)
{
b[c]=i;//存在b[]
c++;
}
}
printf("\n%d的约数为:",k);
for(i=0;i<c;i++)
{
printf("%d ",b[i]);//输出b约数
}
//取出相同的约数
if(c<t)
{
for(i=0;i<=c;i++)
{
for(n=0;n<t;n++)
{
if(a[i]==b[n])
{
d[f]=a[i];
f++;
}
}
}
}
else
{
for(n=0;n<=t;n++)
{
for(i=0;i<c;i++)
{
if(b[n]==a[i])
{
d[f]=b[n];
f++;
}
}
}
}
//输出相同的约数
printf("\n相同的约数是:");
for(i=0;i<f;i++)
{
printf("%d ",d[i]);
}
//求最大约数
for(i=0;i<f;i++)
{
if(u<a[i])
{
temp=u;
u=d[i];
d[i]=temp;
}
}
return u;
}
结果如下:
这样就完成了,两个公约数的最大值提取,虽然的写的风格一般,但思路很清晰。
方法二:
可以直接将两个数放一起进行比较,每当找到一个因子时,就去判断是不是另外一个数的因子,直到找到最大的一个因子,这样能够简化代码,保证代码的简洁。
代码如下:
#include <stdio.h>
void main()
{
int fun(int a, int b);
int a,b; // 变量声明
int Max_common_divisor; // 最大公约数
printf("请输入:");
scanf("%d%d",&a,&b); // 输入两个数
Max_common_divisor=fun(a,b); // 函数调用
printf("最大公约数为:%d\n",Max_common_divisor); // 输出最大公约数
}
int fun(int a, int b)
{
int i; // 循坏变量
int temp;
int max; // 存放公约数
if(a>b) // 让a中存放两个数中的一个小数
{
temp = a;
a = b;
b =temp;
}
for(i=1; i<=a; i++)
{
if(a%i==0)
{
if(b%i==0)
{
max = i;
}
}
}
return max;
}
结果为:
这样就较为简洁的完成了该题编码。
但这样的代码还是有改进和优化的地方,像for(i=1; i<=a; i++)可以改成for(i=1; i<=a/2; i++),但需要注意判断a本身是不是两个数的共同公约数,若是a即为最大公约数,自己可以试着写一下。