题目:
2520 是最小的能被 1-10 中每个数字整除的正整数。
最小的能被 1-20 中每个数整除的正整数是多少?
先看一般会直接想到的办法:
#include<stdio.h>
int main()
{
int i,j,flag;
for(i = 20; ; i ++)
{
flag = 0;
for(j = 11; j <= 20; j ++)
//这里j从11开始就是一种优化,可以自己理解一下,能被11到20之间的每一位数除进,
//同时就意味着也能被1到10直接的每一位数除进。
{
if(i % j != 0)
{
flag = 1;
break;
}
else
continue;
}
if(flag == 0)
{
printf("%d\n",i);
break;
}
}
return 0;
}
这种方法是可以输出答案,但时间复杂度上不是很理想。
下面这种方法是通过最小公倍数的原理来寻找答案。时间复杂度就大大降低了。
#include<stdio.h>
#define N 20
int f(int a,int b)
{
int i,t;
if(a < b){
t = a;a = b;b = t;
}
for(i = a; ; i += a)
if(i % a == 0 && i % b == 0)
return i;
}
int main()
{
int i,k,a[N];
for(i = 0; i < N; i ++)
a[i] = i + 1;
k = 1;
for(i = 0; i < N; i ++)
k = f(k,a[i]);
printf("%d\n",k);
return 0;
}