c++打卡第三十五天
一、最大公约数
1、问题描述
2、设计思路
本题中可以有三种算法,其中我们提供第三种辗转相除法的代码,第一种是从1开始,由于最大公约数可以是最小的那个数,所以我们循环条件到两个之中的小数,如果这个数满足可以整除两个整数,遍历到最大的那个数时,打印出来。第二种是从小数开始循环,当遍历到满足条件的数时直接打印出来就是我们所需要的最大公约数。这里我们介绍辗转相除法,我们记作k=大数/小数,p=大数%小数。这里我们大数=k*小数+p,如果一个数可以整除大数和小数的话,那么余数和小数也是可以被此数整除的,这里可以看出大数和小数的公约数与小数与余数的公约数是相等的,这样我们将小数赋值给大数,余数赋值给小数,那么这个问题就可以转化为逐渐求小数和余数的公约数,直到那个小数为0,此时的大数就是最大公约数。
3、流程图
4、代码实现
#include <iostream> using namespace std; int main() { int n,m,y,p; cin>>m; cin>>n; if(m<n) { y=m; m=n; n=y; } p=m%n; while(p!=0) { m=n; n=p; p=m%n; } cout<<"最大公约数为:"<<m<<endl; return 0; }
5、结果实现
二、最小公倍数
1、设计思路
我们使用辗转相除法所得到的最大公约数乘以最小公倍数就是两个整数的乘积。
2、代码实现
#include <iostream> using namespace std; int main() { int n,m,y,p,k,t; cin>>m; cin>>n; t=m*n; if(m<n) { y=m; m=n; n=y; } p=m%n; while(p!=0) { m=n; n=p; p=m%n; } k=t/m; cout<<"最大公约数为:"<<m<<endl; cout<<"最小公倍数为:"<<k<<endl; return 0; }
3、结果实现