C++020-C++因数,公因数,公倍数

简介: C++020-C++因数,公因数,公倍数

C++020-C++因数,公因数,公倍数

在线练习:

http://noi.openjudge.cn/

https://www.luogu.com.cn/


因数,公因数,公倍数


在数学思维中,了解因数、公约数和公倍数的计算方法是十分必要的,本文的目标在于:


1、了解因数、公约数和公倍数的基本概念

2、掌握求解因数的基本步骤

3、掌握最大公约数和最小公倍数的求法


因数

因数,或称为约数,定义:整数a/整数b==整数c (b=0)而没有余数,我们就说b是a的因数。

注意:如果a/b==c且没有余数,那么能不能满足a/c==b且没有余数呢?所以如果b是a的因数,那么c也是a的因数。即因数大部分是成对出现的。

ee005c86673bad7235799f03a89ef504_7cc389657ed747c79591504cb907e0bf.png


求解因数的枚举方法

#include<iostream>
#include<stdio.h>
#include <time.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        if(n%i==0)
        {
           cout<<i<<" ";
        }
    }
  return 0;
}

eede66833685b6ccfed0a2dcf3f6d779_8fc7d0a5b35d421292573c6aa4b83318.png

题目描述

【描述】任给一个正整数n,求这个数字的不同的因数及其个数。如n=6时,输出1,2,3,6四个因数,并且换行输出总数是4。

【输入】一个整数n;

【输出】两行;第一行从小到大列出因数,空格分隔;第二行是因数的数量。

【样例输入】

6

【样例输出】

1 2 3 6

4


#include<iostream>
using namespace std;
int main()
{
    int n,s=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        if(n%i==0)
        {
           cout<<i<<" ";
           s++;
        }
    }
    cout<<endl<<s;
  return 0;
}


最大公约数

最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有约数中最大的一个。


4的因数有: 1、2、4

8的因数有: 1、2、4、8

则4和8的最大公约数为4。


求解最大公约数的方法:

枚举法

可以使用枚举的方法:从最大的因数开始去除,看两个数字是否都能整除,如果找到第一个那么这个数字就是最大公约数。


#include<iostream>
using namespace std;
int main()
{
    int a,b;
    cin>>a>>b;
    for(int i=min(a,b);i>=1;i--)
    {
        if(a%i==0 && b%i==0)
        {
            cout<<i;
            break;
        }
    }
  return 0;
}

8a6eb8d6f2988c30963abb2daa4645a4_9baa6a5c2768423eb6057f46425a1bbe.png


辗转相除法

辗转相除法是求最大公约数的一种方法。它的具体做法是:


用较大数m除较小数n,得到的余数r作为下次运算中的较小数m,原来的n作为下次运算中的较大数。

如此反复,直到最后余数是O为止,最后的除数就是这两个数的最大公约数。


例如:


对于整数m=12和整数n=8。

12 %8得到余数r=4,将n的值给m,将r的值给n

8 %4得到余数r=0;

r为0,运算结束,则除数n=4就是最大公约数


#include<iostream>
using namespace std;
int main()
{
    int a,b,t;
    cin>>a>>b;
    if(a<b) swap(a,b); // 确保a比b大
//    for(;a%b;)
    while(a%b)
    {
        t=a%b;//保存余数
        a=b; // 把较小的b赋值给a
        b=t; //把余数赋值给b
    }
    cout<<b<<endl;
  return 0;
}

d2ef409746017c6fc393f44ce9651ed9_15bb4941da3f4314a982d771059e0c67.png


最小公倍数

两个或多个整数公有的倍数叫做它们的公倍数,其中除O以外最小的一个公倍数就叫做这几个整数的最小公倍数。


对于整数4和整数8。

4的倍数有:4、8、12…

8的倍数有:8、16、32

则4和8的最小公倍数为8。


求解最小公倍数的方法

枚举法

利用枚举的思想,把任意一个数的倍数从小到大求余另外一个数字,如果能整除,就是最小公倍数。


#include<iostream>
using namespace std;
int main()
{
    int a,b,i=1;
    cin>>a>>b;
    while(1)
    {
        if(a*i % b==0)
        {
            cout<<i*a;
            break;
        }
        i++;
    }
  return 0;
}

15668f53558bf695c7e3a861dfd98c5e_2bdef444c80d454e8957b591a30c175e.png


用最大公约数找最小公倍数

由于两个数的乘积等于这两个数的最大公约数(x)与最小公倍数(y)的积,可以利用最大公约数求两个数字m和n 的最小公倍数m*n==x*y

步骤:


求两个数字的最大公约数,设为x

m/x*n得到m和n的最大公约数


#include<iostream>
using namespace std;
int gcd(int x,int y)
{
    if(x<y) swap(x,y);
    while(x%y)
    {
        int t=x%y;
        x=y;
        y=t;
    }
    return y;
}
int main()
{
    int a,b,g;
    cin>>a>>b;
    int t = gcd(a,b);
    a = a/t;
    b = b/t;
    g = a*b *t;
    cout<<g;
  return 0;
}

98d08ef2ddfc036a678d39916f1bc650_357754cb3fe0487d85585101df7138d0.png


题目描述-已知最大公约数和最小公倍数,求原数

【描述】已知两个数a和b的最大公约数是G,最小公倍数是L,问这两个数可能是多少?列出所有的解。注意,a=3,b=4和a=4,b=3算不同的解。

【输入】两个整数G和L;均在int范围内;

【输出】若干行,一组解占一行;按照a从小到大列出所有解。

【样例输入】

14

280

【样例输出】

14 280

56 70

70 56

280 14

【分析】

两个数可以表示为


a=a1*a2*a3*...*an*G
b=b1*b2*b3*..*bn*G
L =a1*a2*....n*b1*b2*...*bn*G
其中G是a和b中因数的交集,即产生最大公约数的部分因数,那么a1...an与b1...bn没有公因数。
不妨设a=A*G,b=B*G,那么AB=L/G,且AB的最大公约数为1;
我们枚举A和B的组合,就能从A和B计算得到a和b。
#include<iostream>
using namespace std;
int gcd(int x,int y)
{
    if(x<y) swap(x,y);
    while(x%y)
    {
        int t=x%y;
        x=y;
        y=t;
    }
    return y;
}
int main()
{
    int a,b,G,L,A,B;
    cin>>G>>L;
    int t=L/G;
    for(A=1;A<=t;A++)
    {
        if(t%A==0)
        {
            B=t/A;
            if(gcd(A,B)==1)
            {
                cout<<A*G<<" "<<B*G<<endl;
            }
        }
    }
  return 0;
}

b1d0b9792a5023e5706e110f06f0d477_7e26d4de81844e4db4c2a00fbdae60ee.png

作业


在线练习:


http://noi.openjudge.cn/


总结


本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为C++中的因数、公因数、公倍数案例,包括相关案例练习。


相关文章
|
6月前
|
存储 算法 编译器
|
6月前
|
存储 安全 编译器
【C++从练气到飞升】03---C++入门(三)
【C++从练气到飞升】03---C++入门(三)
|
6月前
|
Unix 编译器 C语言
【C++从练气到飞升】01---C++入门(一)
【C++从练气到飞升】01---C++入门(一)
|
6月前
|
存储 自然语言处理 编译器
【C++从练气到飞升】02---C++入门(二)
【C++从练气到飞升】02---C++入门(二)
|
6月前
|
算法 C++
C++009-C++循环结构while
C++009-C++循环结构while
|
6月前
|
算法 C++
C++008-C++循环结构简单统计
C++008-C++循环结构简单统计
|
6月前
|
算法 C++
C++021-C++二分查找
C++021-C++二分查找
C++021-C++二分查找
|
6月前
|
算法 C++
C++019-C++暴力枚举
C++019-C++暴力枚举
C++019-C++暴力枚举
|
6月前
|
机器学习/深度学习 算法 搜索推荐
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
|
6月前
|
算法 搜索推荐 C++
C++017-C++冒泡排序与插入排序
C++017-C++冒泡排序与插入排序
C++017-C++冒泡排序与插入排序