算法设计思路:
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个数求最小公倍数。也明白了测试调试的重要性,是我们必须要学会的,程序是一步一步调试出来的,进一步完善,才能出来一个完整的程序。