Hankson趣味题

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++;
其实写代码时真的不用害怕,要对自己有信心,一点一点来,肯定能有收获,别人的不一定是对的是好的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值