公约数、公倍数

求两数的最大公约数:
//用三种方法求两个整数的最大公约数
//功能:用三种方法实现求两个数的最大公约数
//作者:****
//时间:2017年3月18日

#include <iostream.h> 
//分解质因数法 
int fj(int a,int b)   
{   
    if(a<b)   //始终保持a>b
    {   
       int  t=a;   
        a=b;   
        b=t;   
    }   
    if(b==0)   //0和任意数的最大公约数是任意数
         return a;   
    if(a%2==0 && b%2==0)   //从最小的指数2开始
          return 2*fj(a/2,b/2);   
    if(a%2==0)   
         return fj(a/2,b);   
    if(b%2==0)   //对分解之后的数再进行分解
        return fj(a,b/2);   
    return fj((a+b)/2,(a-b)/2);   
}   
//辗转相除法
int CommonFactor1(int m,int n)   
{   
    int r = m % n; //最大公约数  
    while(r!=0)   
    {   
        m = n;   
        n = r;   
        r = m % n;   
    }   
    return n;   
}
//连续整数检测法   
int min(int m,int n)   
{   
    if(m>=n) return n;   
    else return m;   
}   
int CommonFactor2(int m,int n)   
{   
    int t = min(m,n); //取小  
    while(t!=0)   
    {   
        if(m % t == 0)   
        {   
            if(n % t == 0)  //膜t余0输出t 
                return t;   
            else t--;   
        }   
        else t--;   
    }   
}   
  
void main()   
 {  
	int k=1;  //k为选择标识
		while(k==1)
	{
		cout<<"请输入两个整数:"<<endl;
		 int m,n;   
    cin>>m>>n;
    cout<<"分解质因数法得到它们的最大公约数是:"<<fj(m,n)<<endl;//调用函数  
    cout<<"辗转相除法得到它们的最大公约数是:";   
    cout<<CommonFactor1(m,n)<<endl;//调用函数
	cout<<"连续整数检测法得到它们的最大公约数是:";   
    cout<<CommonFactor2(m,n)<<endl;//调用函数
	cout<<endl;
    cout<<"请选择:1.继续计算 2.结束:";   //选择结束或继续
    cin>>k;
	cout<<endl;
	}
}


求N个数最小公倍数法一:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
int ls[100000]; //定义足够大的空间
cout<<"输入的整数的个数:";
	while(cin>>n)
	{
		cout<<"输入数字:";
		for(int m=0;m<n;m++)
			cin>>ls[m];
		sort(ls,ls+n);
	       int k=ls[n-1];//找出n个数中最大的数
		   for(int i=0;i<n;i++)//依次检索n个数是否所有的都把它整除
		   {
			   if(k%ls[i]!=0)//否则 k++
			   {
				   k++;
				   i=-1;
				}
			}
		   cout<<"最小公倍数是:"<<k<<endl;
		   	return 0;
	}
}
求N个数最小公倍数法二:
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int k,int b)//求两个数的
{
	if(!b)
		return  k;
	gcd(b,k%b);
}
int main()
{
	int n;
	int *ls=new int [10000000];//定义足够大的空间
	cout<<"输入的整数的个数:";
	while(cin>>n)
	{
		cout<<"输入数字:";
		for(int i=0;i<n;i++)
		{
			cin>>ls[i];
		}
		int G=ls[0],M=ls[0];
		for(int j=1;j<n;j++)
		{
			G=gcd(ls[j],M);//两两判定
			if(M<M*(ls[j]/G))//最后一组
				M=M*(ls[j]/G);
		}
		cout<<"最小公倍数是:"<<M<<endl;
		return 0;
	}
}
总结:
    这一次作业做得比较早,比较快。感悟也比较多。首先,虽然这只是一个小程序但用到了不少数学知识,以前我只知道求最大公约数、最小公倍数一种那个方法,老师说叫用三种方法时还是一脸懵逼,在老师提示之下我上网了解了其余几种方法,这才做了出来。所以说,软工专业数学还是要好一点,毕竟能有的想法和思路是非常重要的。
    然后嘛,动手写代码时也要细心,尤其注意中英文切换(写完之后一编译出来全数中英文问题...)。做N个数最小公倍数时候第一种:找出n个数中 最大的数 k,然后次次检索n个数是否所有的都把它整除,否则k++;在整个循环过程中如果 所有的数不能同时把它整数,那么循环不会跳出,跳出时k即为所求。这个思路还挺顺的,第二种方法打了绊子,之前程序错误属于运行错误,一开始用总的乘积 除以n个数的最大公约数。中间结果可能溢出。再次程序错误属于逻辑错误,思路都错了。最后判定 先求前两个数的最小公倍数。用这个最小公倍数和数组下一位再求最小公倍数,依次求出最小公倍数…………不过!这是一种比较麻烦的方法。但是要求用两种,这也算吧。
    总之,要学的东西还很多,分析问题,如何下手,细节,等等等等......















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值