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是能被1到10整除的最小的数。
找出能被1到20整除的最小的数。
分析:
思路1:由小到大循环测试每个数字。[优点:简单,时间换空间,适用于整除数字较小时;缺点:效率低。]
思路2: 让a[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;
}