求一组数据的最大公约数和最小公倍数

求最大公约数采用辗转相除法

求最小公倍数 = 最大公约数 * (A/最大公约数)*(B/最大公约数)

//#include<stdafx.h>
#include<math.h>
#include<assert.h>

#include<stdlib.h>

#include<iostream>
#include<time.h>
using namespace std;
#define INVALID_VALUE32 (0xffffffff)
class ALL_DISTRIBUTE
{
public:
	static double standartDis(int ave, double delta);
	static int __rand(int i, int j);
	static int findMinMulti(int a[], int i, int j);
	static int findMaxDev(int a[], int i, int j);
private:
	static double __rand_zero_one(void);
	static int __minGbs(int i, int j);
	static int __maxGys(int i, int j);
};
/* 两个数的最小公倍数 */
int ALL_DISTRIBUTE::__minGbs(int i, int j)
{
	int maxGys = __maxGys(i, j);
	//cout << maxGys << endl;
	return maxGys * (i/maxGys) * (j/maxGys);
}
/* 两个数的最大公约数 */
int ALL_DISTRIBUTE::__maxGys(int i, int j)
{
	int max = i < j ? j : i;
	int min = i < j ? i : j;
	int idx = min;
	if (min == 0)
	{
		return 1;
	}
	do
	{
		if (max % idx == 0 && min % idx == 0)
		{
			return idx;
		}
		else
		{
			idx = max % min;
			max = min;
			min = idx;
		}
	} while (idx > 0);
	return 1;
}
/* 获取最大公约数 */
int ALL_DISTRIBUTE::findMaxDev(int a[], int i, int j)
{
	int idx = 0;
	if (i>j)
	{
		return -1;
	}
	if (i==j)
	{
		if (a[0]==0)
		{
			return 1;
		}
		else
		{
			return a[i];
		}
	}
	int maxGys = __maxGys(a[i], a[i+1]);

	for (idx = i+2; idx<=j; idx++)
	{
		maxGys = __maxGys(maxGys, a[idx]);
	}
	return maxGys;
}

/* 获取最小公倍数 */
int ALL_DISTRIBUTE::findMinMulti(int a[], int i, int j)
{
	int minGbs;
	int idx;
	if (i<0 || i>j)
	{
		return -1;
	}

	if (i==j)
	{
		return a[i];
	}
	minGbs = __minGbs(a[i], a[i+1]);
	for (idx = i+2; idx <= j; idx++)
	{
		minGbs = __minGbs(minGbs, a[idx]);
		//cout << minGbs << endl;
	}
	return minGbs;
}

int ALL_DISTRIBUTE::__rand(int i, int j)
{
	int ret = 0;

	if (i>j)
	{
		return INVALID_VALUE32;
	}
	ret = i + rand() % (j - i + 1);
	return ret;
}

//产生一个[0-1]的均匀随机数
double ALL_DISTRIBUTE::__rand_zero_one(void)
{
	int ret = rand() % 32767;
	double res = (32767.0 - ret) / 32767;
	return res;
}

double ALL_DISTRIBUTE::standartDis(int ave, double delta)
{
	double random_1 = __rand_zero_one();
	double random_2 = __rand_zero_one();
	double res = 0;
	if (delta <=0 )
	{
		assert(0);
	}
	res = sqrt(delta)*sqrt(-2 * log(random_1))*cos(2*3.14*random_2) + ave;
	return res;
}

int main(int argc, char** argv)
{
	int i = 0;
	int a[3] = { 312, 374, 380 };
	for (i=0; i<3; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
	cout << ALL_DISTRIBUTE::findMaxDev(a, 0, 2) << endl;
	cout << ALL_DISTRIBUTE::findMinMulti(a, 0, 2) << endl;

	return 0;
}

  

原文地址:https://www.cnblogs.com/real-madrid/p/8395096.html

时间: 2024-10-12 14:58:08

求一组数据的最大公约数和最小公倍数的相关文章

写一个方法,求两个数的最大公约数和最小公倍数。

package homework0702; /* * 最大公约数 利用辗转相除法求解两个正整数的最大公约数 在循环中,只要除数不等于0,用较大的数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环较小的数,如此循环直到较小的数值为0,返回较大的数.即为最大公约数. 辗转相除法(欧几里得算法) 定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数.最大公约数(greatest common divisor)缩写为gcd. 最小公倍数 最小公倍数 = (a

求两个数的最大公约数和最小公倍数 C语言

C程序设计第八章的第一道题目,求两个数的最大公约数和最小公倍数.需要注意一下几点: 1.最大公约数和最小公倍数间的关系: 设两个数是a,b最大公约数是p,最小公倍数是q 那么有这样的关系:ab=pq 所以q=ab/p.2.任意整数和0的公约数是该整数的所有约数,所以它们的最大公约数为该整数本身.3.碾转相除法:被除数%除数=余数,如果余数不为0,就让原来的除数做为被除数,余数作为除数,再进行运算 被除数%除数=余数,直到得到的余数为0为止,此时的除数就是最大公约数. #include <stdi

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

除了分解质因数,还有另一种适用于求几个较小数的最大公约数.最小公倍数的方法 下面是数学证明及算法实现 令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍数,(a1,a2,..,an)表示a1,a2,..,an的最大公约数,其中a1,a2,..,an为非负整数.对于两个数a,b,有[a,b]=ab/(a,b),因此两个数最小公倍数可以用其最大公约数计算.但对于多个数,并没有[a1,a2,..,an]=M/(a1,a2,..,an)成立,M为a1,a2,..,an的乘积.例如:[2,

一天一个算法:求俩个数的最大公约数和最小公倍数

求俩个数的最大公约数和最小公倍数 解答: 当较大数除以较小数余数等于0时,较小数为最大公约数. 两数相乘结果除以它们的最大公约数为最小公倍数. int cdivisor(int x1,int y1) { int r,temp; if (x1<y1) { temp =x1; x1 = y1; y1 = temp; } while(x1%y1)//当较大数除以较小数余数等于0时,较小数为最大公约数 { r=x1%y1; x1=y1; y1=r; } return y1; } int cmultipl

C语言之函数调用07—求4个数的最大公约数和最小公倍数

//函数调用 /* ========================================================== 题目:求4个数的最大公约数和最小公倍数. ========================================================== */ #include<stdio.h> long gys(long m,long n) { int t,r; if(m<n) {t=m;m=n;n=t;} while((r=m%n)!=0)

C语言之函数调用08—暴力法求4个数的最大公约数和最小公倍数

//数组枚举法 /* ========================================================== 题目:求4个数的最大公约数和最小公倍数. ========================================================== */ #include<stdio.h> #define N 4 main() { int a[N],gys,gbs; int i,j,m=1; int flag=1; printf("输

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

import java.util.Scanner; //求两个数的最大公约数,最小共倍数. public class CommonMaxDivisor { public static void main(String[] args){ Scanner scanner=new Scanner(System.in); int m=scanner.nextInt(); int n=scanner.nextInt(); scanner.close(); CommonMaxDivisor cmd=new

5.2求两个数的最大公约数和最小公倍数

此处用的是最简单的遍历方法,先求出2个数的最小公倍数,再用两个数之积去除以最小公倍数就能够得到最大公约数. #include <iostream> #include <cmath> using namespace std; int main() { int a,b,c,d; cin>>a>>b; for(int i=a;;i++) { if(i%a==0 &&i%b==0) { c=i; break; } } d=a*b/c; cout<

如何求两个数的最大公约数和最小公倍数

最大公约数:也称最大公因数.最大公因子,指两个或多个整数共有约数中最大的一个. 最小公倍数:几个数共有的倍数叫做这几个数的公倍数,其中除1以外最小的一个公倍数,叫做这几个数的最小公倍数. 特点: