Problem E: 小力的数字游戏 解题报告

Problem E: 小力的数字游戏

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 42   Solved: 21
[ Submit][ Status][ Web Board]

Description

小力在玩一个数字游戏。

一共有n个整数:X1,X2,X3,X4,……,Xn。他可以做任意次如下操作:

在n个数中任意选择两个不同的数,假设为Xi,Xj,( Xi > Xj )。然后他可以将Xi变为Xi-Xj。

小力想让n个数的总和尽可能小,请你帮助小力找到这个最小和。

Input

输入读到文件末尾。

每组测试样例两行。

第一行一个整数n(2<=n<=100)。

第二行n个数,为初始的数组(1<=X<=100)。

Output

每组测试样例一行,输出一个整数,为数组的最小和。

Sample Input

21 232 4 6212 18545 12 27 30 18

Sample Output

261215

HINT

第一组样例中:X2 = X2 - X1;


第二组样例中:X3 = X3 - X2, X2 = X2 - X1.




这题一开始我就看题目,理解它减来减去的到底要做什么?如果有个1的话那就是1,慢慢的看规律,发现就是求这些数字的最大公约数,那么答案就是最大公约数*数目就可以了。我贴一下我的代码,求最大公约数的算法是很普通的算法,效率比较低,但还是A过了,说明这个数据应该不是很强。



#include 

int partion(int g_Number[],int p,int r);
void QuickSort(int g_Number[],int p,int r);

void main(void)
{
	int i,n;
	int a[100];
	int x,t;
	while (scanf("%d",&n) != EOF)
	{
		for (i = 0;i < n;i ++)
		{
			scanf("%d",&a[i]);
		}
		QuickSort(a,0,n - 1);

		x = 1;
		t = 1;
		while (1)
		{
			for (i = 0;i < n;i ++)
			{
				if (a[i] % t != 0)
				{
					break;
				}
			}
			if (t > a[0])
				break;

			if (i == n)
				x = t;
			t ++;
		}
		printf("%d\n",x * n);
	}
}

int partion(int g_Number[],int p,int r)
{
	int tem;
	int x = g_Number[r];
	int i = p - 1,j;

	for (j = p;j < r;j ++)
	{
		if (g_Number[j] < x)
		{
			tem = g_Number[i + 1];
			g_Number[i + 1] = g_Number[j];
			g_Number[j] = tem;
			i ++;
		}
	}

	tem = g_Number[r];
	g_Number[r] = g_Number[i + 1];
	g_Number[i + 1] = tem;

	return i + 1;
}

void QuickSort(int g_Number[],int p,int r)
{
	int q;
	if (p < r)
	{
		q = partion(g_Number,p,r);
		QuickSort(g_Number,p,q - 1);
		QuickSort(g_Number,q + 1,r);
	}
}


你可能感兴趣的:(数据结构和算法)