基本要求: 求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。
提高要求:Hanks博士问题
基本要求::首先要明确如何求最大公约数和最小公倍数。有四种算法:辗转相除、stein算法、穷举法、更相减损法。本程序中运用辗转相除法来求两个数的最大公约数;最小公倍数和最大公约数存在关系:两个数的最大公约数和最小公倍数的乘积等于这两个数的乘积。(求最大公约数算法传送门:https://blog.csdn.net/qq_41233643/article/details/88369518)
最大公约数:
- /*求多个数的最大公约数*/
- int GCD()
- {
- int k,n;
- long a,b,c,r,m[100];
- //printf("请输入整数个数n: ");
- scanf("%d",&n);
- for(k=0;k<=n-1;k++)
- { //printf("%d ",k+1);
- scanf("%ld",&m[k]);
- }
- b=m[0];
- for(k=1;k<=n-1;k++)
- { a=m[k];
- if(a<b)
- {
- c=a;a=b;b=c;
- } // 交换a,b,确保a>b
- // gcd(a,b);
- r=a%b;
- while(r!=0)
- {
- a=b;
- b=r; // 辗转相除
- r=a%b;
- }
- }
- //printf("(%ld",m[0]);
- //for(k=1;k<=n-1;k++)
- // printf(",%ld",m[k]);
- printf("%ld\n",b);
- }
最小公倍数:
- int LCM()
- {
- int t,n;
- // printf("请输入n个数:\n") ;
- while(scanf("%d",&t)!=EOF)
- { int l =1;
- while(t--)
- {
- scanf("%d",&n);
- l=lcm(l,n);//此函数为求两个数的最小公倍数函数
- }
- printf("%d\n",l);
- }
- }
hanks问题:
思路分析:
由题目: 可以得出
x和a0的最大公约数是a1;
//x%a1==0&&a0%a1==0
//gcd(x,a0)=a1
x和b0的最小公倍数是b1。
//b1%b0==0&&b1%x==0
//x*b0=b1*gcd(x,b0)
x为b1的约数,于是要从1~根号b1列举,找存在的x,x符合要求就令计数器+1;
代码:
- int n;
- int a0,a1,b0,b1;
- scanf("%d",&n);
- while(n--) //控制测试组数
- {
- scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
- int temp=0;
- for(int x=1;x<=sqrt(b1);x++ )
- {
- if(b1%x==0)
- {
- if(x%a1==0 && gcd(x/a1,a0/a1)==1 && gcd(b1/x,b1/b0)==1)
- temp++;
- int y=b1/x;if(y==x)
- continue;
- if(y%a1==0 && gcd(y/a1,a0/a1)==1 && gcd(b1/y,b1/b0)==1)
- temp++;
- }
- }
如需源码请:源码下载