C/C++ 求两个正整数的最大公约数和最小公倍数

一.源代码
1.三种以上算法解决两个正整数最大公约数问题。

#include<stdlib.h>  
void help();  
void menu();  
void xiangjian();  
void xiangchu();  
void qiongju();  
int q=1;  
int main()  
{   
    while(q)  
    {  
        menu();  
    }  
    system("pause");  
    return 0;  
}  
void help()  
{  
    printf("欢迎使用最小公倍数计算系统\n");  
    printf("用0--4选择所要执行的操作\n");  
    printf("在输入的两个数字之间用逗号隔开\n");  
    printf("谢谢您的使用\n");  
}  
void xiangjian()//相减法求最大公约数  
{      
    int a,b;  
    printf("请输入两个整数 :");  
    scanf("%d,%d",&a,&b);  
    while(a!=b)//a不等b  
       if(a>b)  
      {  
            a=a-b;  
       }
       else
       {  
            b=b-a;  
        }  
    printf("最大公约数:%d\n",a);  
}   
void qiongju()   //穷举法求最大公约数  
{  
    int m,n,a,b,y;    
    printf("输入两个数字:\n");    
    scanf("%d,%d",&a,&b);  
    m=a;   
    n=b;     
    for (y=a;y>0;y--)
        if (a%y==0&&b%y==0)break;
        printf("最大公约数是:%d\n",y);
}
void xiangchu()//相除法求最大公约数  
{  
   int a,b,c,x,y;   
   printf("请输入两个数字:\n");    
   scanf("%d,%d",&a,&b);
   x=a;    
   y=b;
   while(b!=0)  //一直除到余数等于0停止循环     
   {   
       c=a%b;  
       a=b;   
       b=c;  
   }    
    printf("最大公约数是:%d\n",a);     
}  
void menu()//界面菜单  
{  
   int num;  
   printf("      @@@@@@@@@@@@@@@@@@@@@@@@      \n");  
   printf("       三种算法求最大公约数     \n");  
   printf("      **********************      \n");   
   printf("   *****        菜单        *****\n");  
   printf("       * 0.系统帮助及说明   *\n");     
   printf("       * 1.辗转相减法       *\n");   
   printf("       * 2.穷举法           *\n");  
   printf("       * 3.辗转相除法       *\n");   
   printf("       * 4.退出系统         *\n");  
   printf("      @@@@@@@@@@@@@@@@@@@@@@@@ \n");  
   printf("请选择菜单编号:");  
   scanf("%d",&num);  
   switch(num)  
   {
   case 0:help();break;  
   case 1:xiangjian();break;  
   case 2:qiongju();break;  
   case 3:xiangchu();break;  
   case 4:q=0;break;  
   default:printf("请在0-4之间选择\n");
   }  
}
2.程序流程图:辗转相除法
![这里写图片描述](https://img-blog.csdn.net/20180906193112946?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg5NTQ0Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
3测试过程:测试用例
 Input:  5 15
Output:5
![这里写图片描述](https://img-blog.csdn.net/2018090619335724?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg5NTQ0Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
二、  求3个正整数最小公倍数。
源代码:
#include<stdio.h>
int gcd(int m, int n)//最大公约数函数
{
    if(m%n == 0)
        return n;
    return gcd(n, m%n);
}
int lcm(int m, int n)//最小公倍数函数
{
    return m*n/gcd(m,n);//两数之积除以它们的最大公约数等于最小公倍
}
int main()//主函数
{
    int n, i, *a, r=1;
    printf("\n请填写输入数据的个数:");
    scanf("%d",&n); 
    a=(int *) malloc (sizeof(int) * n);//申请动态数字空间
    printf(" \n请输入数据:");
//先求两个数的最小公倍数,然后用结果和第三个数求最小公倍数,依次类推,直到用前n-1个数的最小公倍数和第n个数求最小公倍数,即为最终结果
    for(i=0;i<n;i++)
        scanf("%d",a+i);
    for(i=0;i<n;i++)
        r=lcm(r,a[i]);//最终的最小公倍数
    printf(" \n最小公倍数为:r=%d\n ",r);
    free(a);//释放空间
    return 0;
}



1.1算法思路:在上述方法3的基础上进行两两之间求最大公约数。
1.2算法思路:先分别循环输出三个数的倍数,再找出这三个数组中相同的数,将这些数放在一个新的数组中,使用sort()排序后进行输出 
先设置一个number=1,然后while

True进行循环,判断number对abc取余,当它们的余数同时为0的时候break然后打印出number的数值,否则number+=1.
2.程序流程图:
这里写图片描述
这里写图片描述
3.测试结果:
测试用例(程序设计的是求n个数字的最小公倍数)
Input:1 2 3 4 5
Output:60
这里写图片描述
三、个人总结
这次的作业是求最大公约数和最小公倍数,但是要用三种算法来写的话的确还要费点劲,最好想也最简单的当然属欧几里得算法(辗转相除法)了,其次我还用到了相减法和穷举法,起初觉得要用三种算法来做有点困难,但是现在我觉得,只要理解了算法,那么将其转换成代码就没有太大的问题,当然,说在编写程序时没有遇到困难是不可能的,一个良好的程序应该是在不断的修改当中完成的。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值