1.基本要求
求N个数的最大公约数和最小公倍数
1.1算法思路
先求出两个数的最大公约数(最小公倍数),然后将他们的最大公约数(最小公倍数)与第三个数求最大公约数(最小公倍数),由此递推求多个数的最大公约数(最小公倍数)。
1.3运行结果
1.4调试结果
2.提高要求
Hankson趣味题—“求公约数”和“公倍数”之类问题的逆问题
2.1算法思路
先用穷举法求出两个数的最大公约数和最小公倍数,再根据题目中提到的x和a0的最大公约数是a1,x和b0的最小公倍数是b1,来挑选符合这个条件的x的个数
2.3运行结果
2.4调试结果
3.源代码
#include<stdio.h>
#define N 100
//穷举法求两个数的最大公约数
int gcd(int x,int y){
int temp;
temp=(x>y)?y:x;
while(temp>0){
if(x%temp==0&&y%temp==0) //只要能找到一个数能同时被x,y整除,则中止循环
break;
temp--; //如果不满足if条件则变量自减,直到能被x,y整除
}
return temp;
}
//穷举法求两个数的最小公倍数
int mul(int x,int y){
int p,q,temp;
p=(x>y)?x:y;//最大值赋给p为变量自增做准备
q=(x>y)?y:x;
temp=p;
while(1){
if(p%q==0)
break;
p+=temp;
}
return p;
}
//N个数的最大公约数
int ngcd(int a[],int n)//n为数组a[]的大小
{
int x=a[0],y=a[1];
int temp=gcd(x,y);//先求a[0],a[1]两个数的最大公约数
for(int i=2;i<n;i++)
{
temp=gcd(temp,a[i]);//用该最大公约数与a[i]再求最大公约数
}
return temp;
}
//N个数的最小公倍数
int mulgcd(int a[],int n)
{
int x,y,m,temp=a[0];
for(int i=1;i<n;i++)//先求出两个数的最小公倍数,再用该数与a[i]循环求最小公倍数
{
x=temp;
y=a[i];
m=gcd(x,y);
temp=x*y/m;
}
return temp;
}
int main()
{
printf("----------------------------------------------\n");
printf(" 1.求N个数的最大公约数和最小公倍数\n");
printf(" 2.求Hankson趣味题\n");
printf("----------------------------------------------\n");
int m;
printf("请输入你想进行的操作:\n");
scanf("%d",&m);
if(m==1)
{
int nngcd,mmulgcd;
int a[N];
int i,n;
int flag=1;
while(flag)
{
printf("请输入要求多少个数的最大公约数和最小公倍数:");
scanf("%d\n",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
nngcd=ngcd(a,n);
mmulgcd=mulgcd(a,n);
printf("%d个数\n",n);
printf("最大公约数:%d\n",nngcd);
printf("最小公倍数:%d\n",mmulgcd);
printf("是否继续操作?\n");
scanf("%d",&flag);
if(flag==0)
break;
}
}
if(m==2)
{
int n,a0,a1,b0,b1,sum=0;//sum用来统计满足条件的x的个数
printf("请输入需要测几组数:");
scanf("%d",&n);
while(n--)
{
printf("请输入数据:\n");
scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
for(int i=0;i<=b1;i++)//循环判断从0-b1满足条件的i
{
if(gcd(i,a0)==a1&&mul(i,b0)==b1)//i和a0的最大公约数是a1,i和b0的最小公倍数是b1
sum++;
}
printf("满足条件的数有%d个\n",sum);
sum=0;
}
}
}
3.总结
首先,对于求N个数的最大公约数和最小公倍数,并没有很难,因为上次写过,只不过是多了一个步骤。算法思路:先求两个数的,再利用循环求N个数的,也很容易想到和理解。其次,对于Hankson趣味题,确实费了一番功夫。刚开始一看到这么长的题目,就对自己没有信心,心里觉得自己肯定写不出来,就想看看别人的代码,看看别人是这么想的,结果这一看,把自己带进去了,思路是各种各样,越看越迷糊,对自己越没有信心。看别人写的代码花了很长时间,但收获却很小,以至于我差点放弃写。后来就想着按自己理解的试试,结果还真让我写出来了!其实判断x符合的条件特别简单,为什么要用数学推呢?直接把题目中的条件带进去不就好了吗,就是这条语句: if(gcd(i,a0)==a1&&mul(i,b0)==b1)
sum++;
其实写代码时真的不用害怕,要对自己有信心,一点一点来,肯定能有收获,别人的不一定是对的是好的。