首页 > 其他分享 >P1029 最大公约数和最小公倍数问题

P1029 最大公约数和最小公倍数问题

时间:2024-01-30 16:15:26浏览次数:17  
标签:count 公倍数 int 最大公约数 include P1029

3 2 1 上题目链接:
P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

本小蒟蒻的原始思路就是枚举所有范围内的数,分别求出他们的最大公约数和最小公倍数,再看是否满足题意。

于是就有了以下一言难尽的东西(;′⌒`)↓

#include <stdio.h>

int main()
{
    int x,y,count;
    scanf("%d%d",&x,&y);
    for(int i=x;i<=y;i+=x)//i+=x是因为求出来的数肯定是x的倍数,所以就以x为增量了
    {
        for(int j=x;j<=y;j+=x)
        {
            int m=i,n=j,t;
            while(m%n)//求最大公约数
            {
                t=m%n;
                m=n;
                n=t;
            }
            if(n==x&&i*j==x*y)//i*j==x*y是因为最小公倍数等于两个数的乘积除以最大公约数
                count++;
        }
    }
    printf("%d",count);
    return 0;
}

皇天不负有心人,收到了2个TLE,其他全WA

自我反省大佬们的题解,做了以下优化↓

#include <stdio.h>
#include <math.h>

int main()
{
    int x,y,count=0;
    scanf("%d%d",&x,&y);
    if(x==y)//特解
        count--;
    for(int i=x;i<=sqrt(x*y);i+=x)//减少循环次数
    {
        for(int j=x;j<=y;j+=x)
        {
            int m=i,n=j,t;
            while(m%n)
            {
                t=m%n;
                m=n;
                n=t;
            }
            if(n==x&&i*j==x*y)
                count+=2;//每次加2,因为i和j倒过来又是一种情况
        }
    }
    printf("%d",count);
    return 0;
}

注:

  1. 补充上遗漏的特解(不然也会错),x=y时,只会出现一次
  2. x=y时,i=j=x=y,在此之后就都是倒过来重复的情况,所以循环到√(x*y)即可,减少了循环次数
  3. 综上,count每次+2,特解时count-1即可

不知道为什么就能AC了,有大佬说需要用long long,不然会爆,但我没有(⊙o⊙)?

觉得还有一个方法很好,递归辗转相除求最大公约数:

int gcd(int n,int m)
{
    if(n%m==0)
	return m;
    else 
	return gcd(m,n%m);
}

标签:count,公倍数,int,最大公约数,include,P1029
From: https://www.cnblogs.com/vicky-han/p/17997266

相关文章

  • 1,2,3……n的所有数的最小公倍数?
    importmathdeflcm(a,b):returna*b//math.gcd(a,b)deflcm_range(n):lcm_value=1foriinrange(2,n+1):lcm_value=lcm(lcm_value,i)returnlcm_valuen=81#输入给定的数值nresult=lcm_range(n)......
  • 求最大公约数
    欧几里得算法基础:设有几个数\(a,b,c\)若\(a|b\)且\(a|c\)则\(a|b+c\)故而我们可以推出\(a|xb+yc\)我们可以推出\((a,b)=(b,a\modb)\)注:()是括号内两个数公约数集合​ |是整除得意思。证明:因为\(a\modb==a-[\fracab]*b\)故而我们根据上述定理。设左边任何一个公约......
  • P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    首先最大公因数和最小公倍数之积等于两个原数的积,这是基本性质然后两个数中,最小也是大于等于最大公因数,最大不超过最小公倍数最暴力的方法是,在这个范围内遍历其中一个数,积除以这个数得到另一个数,然后用辗转相除法进行判断就可以求解。当然,可以缩短范围。缩短范围有两个基本思想......
  • C练习题——打印两个数的最大公约数
    算法一:暴力求解(效率不够)#include<stdio.h>intmain(){inta=0;intb=0;scanf("%d%d",&a,&b);intmin=a<b?a:b;while(1){if((a%min==0)&&(b%min==0))break;......
  • 求两数的最大公约数和最小公倍数的n种方法
    最大公约数:公约数,亦称“公因数”。它是指能同时整除几个整数的数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。对任意的若干个正整数,1总是它们的公因数。最小公倍数:两个或多个整数公有的倍数中,除0以外最小的一个公倍数。......
  • 求其最大公约数和最小公倍数,一行代码完成
    题目:输入两个正整数m和n,求其最大公约数和最小公倍数。求出最大公约数就行,最小公倍数用m*n除以最大公约数就行packagemyself;importjava.util.Scanner;/***@AutherQY*@Date2023/12/11*/publicclassSix{publicstaticvoidmain(String[]args){......
  • n个数算最小公倍数(优化版)
    #include<stdio.h>intret(intx,inty){  inti=1;  if(x%y==0||y%x==0)    return(x>y?x:y);  else  {   for(i=1;i<=x*y;i++)    {      i=x*i;      if(i%y==0) ......
  • P1029 最大公约数和最小公倍数问题(普及−) 题解
    题目传送门想要做这题,我们要先了解一下最大公约数。最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短......
  • 求四个数的最小公倍数
    #include<stdio.h>longintfact(longintx,longinty){ inti,j;  for(i=1;i<=x*y;i++) {  if(x%y==0||y%x==0)  {  returnx>y?y:x;  break;  }    j=x*i;  if(j%y==0)  {  returnj;......
  • 求两个数的最小公倍数
    #include<stdio.h>intmain(){  inti,j,k,t=0;  printf("请输入两个数:");  scanf_s("%d,%d",&i,&j);   for(k=1;k<=i*j;k++)  {       if(i%j==0||j%i==0)    {      printf("%d,%d......