求n个数最小公倍数


算法设计思路:

   1.  用一个数组a[n]存n个要求最小公倍数的数,分别为a[0]a[1]到a[n-1],先用辗转相除法GCD(a,b)求两个数最大公约数,然后LCD(a,b)=a*b/ GCD(a,b)求最小公倍数,先求a[1]= LCD(a[0]a[1]),再求a[2]= LCD(a[1]a[2]),最后a[n-1]=LCD(a[n-1]a[n-2])为结果。

    2. 穷举法求最小公倍数,令i为两个数中最大,i自增,直到i对这两个数取余都为0,i即为这两个数的最小公倍数。

<span style="color:#3366ff">// 最小公倍数.cpp : 定义控制台应用程序的入口点。
//
/*
program:求最小公倍数
作者:杨柳
创建时间:2017/3/18
IDE:visual studio 2012
OS : windows10-Ultimate
功能:
1.用辗转相除法求两个数的最大公约数进而求n个数的最小公倍数
2.穷举法求最小公倍数,令i为两个数中最大,i自增,直到i对这两个数取余都为0,i即为这两个数的最小公倍数。
*/</span>

#include "stdafx.h"
#include<stdio.h>
#define max 1000
int flag=1;//标记是否退出变量
void main()
{ 
	int GCD(int m,int n);
	int LCD(int m,int n);
	int SLCD(int m,int n);
	while(flag)
	{
	  int n,i,t;
	  int a[max];
	  printf("请输入一组要求最小公倍数的数的个数n:\n");
	  scanf_s("%d",&n);
	  printf("请输入%d个求最小公倍数的数:\n",n);
	  for(i=0;i<n;i++){
		  scanf_s("%d",&a[i]);
      }
	  printf("调用最大公约数求最小公倍数:\n");
	  printf("\n");
	  for(i=0;i<n-1;i++){
		  a[i+1]=LCD(a[i],a[i+1]);
	     }
	     printf("最小公倍数为%d\n",a[n-1]);//调试缺少%d
		 printf("穷举法求最小公倍数:\n");
	  printf("\n");
	  for(i=0;i<n-1;i++){
		   a[i+1]=SLCD(a[i],a[i+1]);
	    }
	    printf("最小公倍数为%d\n",a[n-1]);//调试缺少%d
	    printf("继续查询请按1,退出查询请按2\n");
	    scanf_s("%d",&t);
	    if(t!=1)
		  flag=0;
	}
} 
/*用辗转相除法求两个数的最大公约数*/
int GCD(int m,int n){

	int t;
	if(m<n)  //确保m一定要大于n
	{
		m=m+n;
		n=m-n;
		m=m-n;
	}
	while(n!=0)//当n不等于0,用辗转相除
	{
		t=m%n;	
		m=n;//n的值赋给m
		n=t;//t的值赋给n
	}	
	return m;
}

/*调用最大公约数求最小公倍数*/
int LCD(int m,int n){
    int t;
	t=GCD(m,n);
	int result =m*n/t;
	return result;
}


/*穷举法求最小公倍数*/
  int SLCD(int m,int n){
	int i;
	
	if(m<n)  //确保m一定要大于n
	{
		m=m+n;
		n=m-n;
		m=m-n;
	}
    for(i=m;;i++)  //最小公倍数
    {  
        if(i%m == 0 && i%n==0)   
	     break;
	} 
	return i;
}

总结:

      这个作业我犯了一个低级错误,printf中缺少%d的,程序一周跳出来,我找了一晚上第二天才发现,感觉以后要尽量细心避免小错误。还有,我用了一维数组储存n个数,实现了n个数求最小公倍数。也明白了测试调试的重要性,是我们必须要学会的,程序是一步一步调试出来的,进一步完善,才能出来一个完整的程序。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值