zoukankan      html  css  js  c++  java
  • gcd约分函数的应用

    在编写C++的时候我们经常遇到分数当要约分时,是一件头疼事情那我们怎么办?

    这时候我们就要使用函数gcd了.

    如下面的例题

    题目描述

    输入 22 个正整数 x_0,y_0(2 le x_0<100000,2 le y_0<=1000000)x0,y0(2x0<100000,2y0<=1000000) ,求出满足下列条件的 P,QP,Q 的个数

    条件:

    1. P,Q 是正整数

    2. 要求 P,Q 以 x_0x0 为最大公约数,以 y_0y0 为最小公倍数.

    试求:满足条件的所有可能的 22 个正整数的个数.

    输入输出格式

    输入格式:

    22 个正整数 x_0,y_0x0,y0

    输出格式:

    11 个数,表示求出满足条件的 P,Q 的个数

    输入输出样例

    输入样例#1: 复制
    3 60
    
    输出样例#1: 复制
    4
    

    说明

    P,Q 有4种

    1、3,60
    2、15,12
    3、12,15
    4、60,3

    题解思路如下

    如题意我们可以知道它已经给出了最大公约数和最小公倍数,由数论的知识可以知道在知道最大公约数和最小公倍数的情况下满足这两个条件的数他们的乘积等于最大公约数和最小公倍数的乘积,举个列子如样例最大公约数x0=3,最小公倍数y0=60.满足这两个条件的数有(3,60),(15,12),(12,15),(60,3);

    我们可以发现x0*y0=3*60或15*12或12*15或60*3;

    发现这个后我们就知道了这怎个数据的最大范围,就可以枚举答案了

    AC代码如下

    #include <iostream>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    int main()
    {
           int x0,y0,ans=0,tmp;//将ans赋值为0方便后面我们计数,tmp记录数据范围
           int a,b;
           cin>>x0>>y0;
           tmp=x0*y0;//由前面的分析可的数据的范围
           for(int a=1;a<=tmp;a++)//开始判断
           {
                 if(tmp%a!=0) continue;//我们知道tmp是两个数的乘积所以a,b必定是tmp的因数如果不是循环就断掉
                 b=tmp/a;//计算出另一个数
                 if(__gcd(a,b)==x0)//判断这两个数的最大公约数是否为x0,因为我们声名了一个<cmath>的头文件库所以可以直接调用gcd函数来找这两个数的最大公约数
                 ans++;//如果最大公约数为x0则满足题意ans+1计数
          }
         cout<<ans;
         return 0;
    }

  • 相关阅读:
    Nginx反向代理负载均衡
    Nginx服务rewrite模块功能说明 网站自动跳转功能
    利用C51单片机模拟SPI进行双机通信
    WIN10家庭版桌面右键单击显示设置出现ms-settings:display或ms-settings:personalization-background解决办法[原创]
    Docker for Mac k8s 网络不通
    Firefox 清理 DNS 缓存
    探索 IPv6 网络
    Firefox 印象笔记剪藏插件登录国内账号
    k8s ingress 转发服务,内容显示不全问题
    k8s 获取 Pod ip 添加到环境变量
  • 原文地址:https://www.cnblogs.com/2050792294-qq/p/9342472.html
Copyright © 2011-2022 走看看