求N个数的最小公倍数和最大公约数
可采用的算法:
1.枚举
2.辗转相除
3.更相减损术
4.Stein算法
分析得:求N个数的最小公倍数和最大公约数,需要循环调用算法函数,可以先求出两个数的最小公倍数,将这个最小公倍数和下一个数传给函数,就这样循环传参数再调用,即可求出这N个数的最小公倍数;最大公约数也是一样。
枚举法
先将输入的数从小到大依次排序(算法采用冒泡),选其中最小的数,从这个数的依次递减来遍历所有数,直到所有数都可以整除,立刻返回这个除数,这个除数,就是最大公约数。
#include<iostream>
using namespace std;
int a[100];
void sort(int a[100],int n); //冒泡排序
int main()
{
int n;
int gcd[100];
cout<<"输入数字的个数:";
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,n);
for(int j=a[0];j>=1;j--)
{
int flag=0;
for(int k=0;k<n;k++)
{
if(a[k]%j==0)
{
flag++;
}
}
if(flag==n) //判断所有数的个数是否等于能整出J的个数
{
cout<<"最大公约数:"<<j<<endl;
return 0;
}
}
return 0;
}
void sort(int a[100],int n) //冒泡排序算法
{
int temp;
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
枚举结果
辗转相除
算法描述:
采用函数嵌套调用进行求两个数的最大公约数和最小公倍数,叙述如下:
其算法过程为: 前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数;
1、大数放a中、小数放b中;
2、求a/b的余数;
3、若temp=0则b为最大公约数;
4、如果temp!=0则把b的值给a、temp的值给a;
5、返回第二步;
/*title:求N个数的最小公倍数和最大公约数
* 思路:辗转相除法求最大公约数,再求最小公倍数
* author:Qi
* 编译语言 JAVA
* 系统版本 win10
* 编译器 eclipse
* javac -version10.1
*/
package java_homework;
import java.util.Scanner;
public class N_GCD {
public static int GCD(int a,int b) { //求最大公约数
int remainder=a%b;
for(int n=0;a%b!=0;n++)
{
remainder=a%b;
a=b;
b=remainder;
}
return b;
}
public static int MIN(int a,int b) { //最小公倍数
int c=a*b;
int remainder=a%b; //remainder 余数
for(int n=0;a%b!=0;n++)
{
remainder=a%b;
a=b;
b=remainder;
}
return c/b;
}
public static void main(String arg[]) {
int[] arr=new int[100];
int result_GCD,result_MIN;
Scanner scanner=new Scanner(System.in);
System.out.println("请输入有多少数字:");
int n=scanner.nextInt();
for(int i=0;i<n;i++)
{
System.out.print("请输入第"+(i+1)+"个数:");
arr[i]=scanner.nextInt();
}
result_GCD=arr[0];
result_MIN=arr[0];
for(int j=1;j<n;j++)
{
result_GCD=GCD(result_GCD,arr[j]); //循环调用得出最大公约数
result_MIN=MIN(result_MIN,arr[j]); //循环调用得出最小公倍数
}
System.out.print("最大公约数为:");
System.out.println(result_GCD);
System.out.print("最小公倍数为:");
System.out.print(result_MIN);
}
}
测试
测试正确