欧拉计划第5题

Problem 5:

        2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

        What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20.

问题5

        2520是能被110整除的最小的数。

        找出能被120整除的最小的数。

分析:

        思路1:由小到大循环测试每个数字。[优点:简单,时间换空间,适用于整除数字较小时;缺点:效率低。]

        思路2a[1]~a[n]等于1~n,用a[n]整除a[1]~a[n-1](若能整除,每个的数最多除1次),则最小整数可由a[1]*a[2]*...a[n]得到。[优点:效率高,空间换时间;]

思路2程序如下:

解:

#include <stdio.h>
#include <malloc.h>

#define PRINT    printf
#define DPRINT   printf

typedef int      INT;
typedef char     CHAR;
typedef void     VOID;

INT MinDivNum(INT n)	//返回能被[1~n]整除的最小整数
{
	if (n<1 || n>22)
		return -1;

	INT *a;
	a = (INT *)malloc(sizeof(INT)*(n+1));

	//让a[1]~a[n]等于1~n,用a[n]整除a[1]~a[n-1](若能整除,每个的数最多除1次)
	//,则最小整数可由a[1]*a[2]*...a[n]得到
	INT i, j;
	for (i=2; i<=n; i++)
	{
		a[i] = i;
		for (j=2; j<i; j++)
		{
			if(0 == a[i] % a[j])
				a[i] /= a[j];
		}
	}

	INT nRes;
	nRes = 1;
	for (i=2; i<=n; i++)
		nRes *= a[i];

	free(a);

	return nRes;
}

INT main(INT argc, CHAR *argv[])
{

	INT n;
	INT nRes;

	while (1)
	{
		PRINT("请输入整除的最大数字[1~22],输入负数退出:\n");
		scanf("%d", &n);

		if (n < 0)
			break;

		nRes = MinDivNum(n);
		PRINT("能被1到%d整除的最小整数为:\n%d\n\n", n, nRes);
	}

	return 0;
}

你可能感兴趣的:(测试,n2)