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

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

求最小公倍数 = 最大公约数 * (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;
}

  

posted @ 2018-01-31 22:10  24k的帅哥  阅读(943)  评论(0编辑  收藏  举报