喜迎
春节

求多个数的最大公约数,最小公倍数以及hanks son问题


基本要求: 求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。

提高要求:Hanks博士问题 

     基本要求::首先要明确如何求最大公约数和最小公倍数。有四种算法:辗转相除、stein算法、穷举法、更相减损法。本程序中运用辗转相除法来求两个数的最大公约数;最小公倍数和最大公约数存在关系:两个数的最大公约数和最小公倍数的乘积等于这两个数的乘积。(求最大公约数算法传送门:https://blog.csdn.net/qq_41233643/article/details/88369518

最大公约数:

  1. /*求多个数的最大公约数*/
  2. int GCD()
  3. {
  4. int k,n;
  5. long a,b,c,r,m[100];
  6. //printf("请输入整数个数n: ");
  7. scanf("%d",&n);
  8. for(k=0;k<=n-1;k++)
  9. { //printf("%d ",k+1);
  10. scanf("%ld",&m[k]);
  11. }
  12. b=m[0];
  13. for(k=1;k<=n-1;k++)
  14. { a=m[k];
  15. if(a<b)
  16. {
  17. c=a;a=b;b=c;
  18. } // 交换a,b,确保a>b
  19. // gcd(a,b);
  20. r=a%b;
  21. while(r!=0)
  22. {
  23. a=b;
  24. b=r; // 辗转相除
  25. r=a%b;
  26. }
  27. }
  28. //printf("(%ld",m[0]);
  29. //for(k=1;k<=n-1;k++)
  30. // printf(",%ld",m[k]);
  31. printf("%ld\n",b);
  32. }

最小公倍数:

  1. int LCM()
  2. {
  3. int t,n;
  4. // printf("请输入n个数:\n") ;
  5. while(scanf("%d",&t)!=EOF)
  6. { int l =1;
  7. while(t--)
  8. {
  9. scanf("%d",&n);
  10. l=lcm(l,n);//此函数为求两个数的最小公倍数函数
  11. }
  12. printf("%d\n",l);
  13. }
  14. }

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;

代码:

  1. int n;
  2. int a0,a1,b0,b1;
  3. scanf("%d",&n);
  4. while(n--) //控制测试组数
  5. {
  6. scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
  7. int temp=0;
  8. for(int x=1;x<=sqrt(b1);x++ )
  9. {
  10. if(b1%x==0)
  11. {
  12. if(x%a1==0 && gcd(x/a1,a0/a1)==1 && gcd(b1/x,b1/b0)==1)
  13. temp++;
  14. int y=b1/x;if(y==x)
  15. continue;
  16. if(y%a1==0 && gcd(y/a1,a0/a1)==1 && gcd(b1/y,b1/b0)==1)
  17. temp++;
  18. }
  19. }

如需源码请:源码下载


文章作者: 周周
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 周周 !
评 论
  目录