欸嘿 又是我,今天我们来讲解一下欧拉计划的第五题捏。
题目如下:
哇塞 这么简单的题要是出现在期末考试中就太好了!
直接for循环遍历!
#include <stdio.h>
int main()
{
long a=1,b=2520; //因为2520是1-10的整除数 所以避免过多运算 b从2520开始
while(a<=20) //a从1-20 用b判断是否能被a整除
{
if(b%a==0)
{
a++;
}
else //a重置 b增值
{
b++;
a=1;
}
}
printf("%ld",b);
}
但是,这样做的话,如果最终数字很大,无疑会有很长的运算时间。
此程序的代码只有十多行,但运算时间超过了1秒,运行时会有肉眼可见的停顿。
即使我是一名小白程序员,没有学过算法和数据结构,但是练题不是直接上手的,是需要思考的。
我们现在就来思考一下一个简单的算法。
能被1-20整除的最小数,也就是它是1-20的最小公倍数。
我们可以用一个数组存储1-20 然后查找最小公倍数。
一个非常简单的方法就是: a与b的最小公倍数 = a*b / a与b的最大公约数
我们的问题又变成了如何寻找最大公约数。
如果要寻找a和b的最大公约数 很简单的方法就是比较a和b的大小 找出较小的值
然后从较小值开始不断递减到1结束,其中第一次找出的能被a和b同时整除的数为最大公约数。
//我们写一个函数来求最大公约数
int Maxdiv(int a,int b)
{
int i; //循环变量
int min;//a和b中的更小值
(a<b)? min=a : min=b;
for (i = min;i>0;i--)
{
if ( a%i==0 && b%i==0 )
{
return i; //当i能被a和b整除时返回
}
}
}
最大公约数的函数已经实现了,我们可以着手做题了。
#include <stdio.h>
int Maxdiv(int a,int b);//函数声明
int main(void)
{
int arr[20];
int i;//循环变量
long long num; //两个数相乘也许会溢出 写成longlong
for (i=0; i<20; i++)
{
arr[i]=i+1; //将1-20放入数组中
}
num = 1;
for (i=1; i<20; i++)
{
num = num*arr[i] / Maxdiv(num,arr[i]);
//找出最大公约数 用公式求出最小公倍数 用最小公倍数和下一个数再找最大公约数
}
printf("%lld\n", num);
return 0;
}
//我们写一个函数来求最大公约数
int Maxdiv(int a,int b)
{
int i; //循环变量
int min;//a和b中的更小值
(a<b)? min=a : min=b;
for (i = min;i>0;i--)
{
if ( a%i==0 && b%i==0 )
{
return i; //当i能被a和b整除时返回
}
}
}
答案:232792560
希望大家能多多点赞,感谢支持!