公约数、公倍数

来源:互联网 发布:求推荐淘宝美国代购店 编辑:程序博客网 时间:2024/05/15 17:18

求两数的最大公约数:
//用三种方法求两个整数的最大公约数//功能:用三种方法实现求两个数的最大公约数//作者:****//时间: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
原创粉丝点击