求N个数的最小公倍数和最大公约数

求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);
    	}
    	}

测试
在这里插入图片描述测试正确

发布了12 篇原创文章 · 获赞 13 · 访问量 5346

猜你喜欢

转载自blog.csdn.net/qq_41522951/article/details/88760486