Project Euler 001~005


开始了填欧拉计划的坑.
应该不会有觉得欧拉是替身使者的人吧....以防万一多说一句是那位迫害广大学渣的伟大数学家,不是某jo太郎打的拳。
关于啥是Project Euler 详见 https://projecteuler.net/about
总之就是给出了一系列需要依赖数学方面的知识与编程能力结合的有趣的题,难度也跨度较广,但肯定是越往后越难的
因为只有前100题属于新手向且无所谓答案讨论公开与否 所以这个坑可能就完结于第100题吧..大概 如果不咕咕咕的话。(再往后的题大概率会因本人太菜写不出来了)
(因为前面的都挺简单 所以就多题放一起 后期估计就1题水一期了)

观前声明:
这是个人兴趣使然的对自己入坑pe的记录,仅提供思路和部分代码;各个方面肯定都是有着优化与提升空间的,甚至在许多大佬看来这应该是初学者的浅薄而未经剪枝的丑码,如果能帮到有兴趣的人自是最好,也欢迎能醍醐灌顶的深度讨论。
大佬看到了笑笑就行,还请轻喷。
带着恶意,抬杠者...俺也喷不过您,也不能拿您咋样...毕竟这只是我个人兴趣使然的行为或者说是学习记录分享。 (说是记录,但因为是早先写的所以其实是在各种意义上公开处刑和吐槽自己 并尝试补救优化)
语言是c++,用的VS平台

那么第一题原题如下:
Multiples of 3 and 5
Problem 1
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
求1000以下3或5的倍数的和,毕竟是第一题也就这么个难度,甚至不需要代码.
容斥随便算算:
3的等差数列+5的等差数列-15的等差数列
(999为3n的第333项,995为5n的第199项,990为15n的第66项)
答案是233168

第二题:
Even Fibonacci numbers
Problem 2
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
求4000000以内的斐波那契数列中的值为偶数的项的和.
斐波那契数列的通项其实只要具有高中的数列知识就能用待定系数法自己推出来...
但在这用通项估计是不好使的.所以节能的我放弃手算了
现在想来可以在全局设置一个数组静态存储每一项然后顺序动态规划的,但当时的我非常头铁直接就毫无优化的使用递归函数了
int fabonaci(int n)
{
if (n == 1)return 1;
if (n == 2)return 2;
return fabonaci(n - 1) + fabonaci(n - 2);
}
int main()
{
int n, sum = 0;
for (n = 1; fabonaci(n) <= 4000000; n++)
if (fabonaci(n) % 2 == 0)sum += fabonaci(n);
cout << sum;
return 0;
}
实际上这是个时间复杂度相当高的代码 单个项n要跑o(2^n)左右(大概?),在主函数里甚至每个n都要跑一遍 毫无人性 现在的我看来都觉得蠢 至少用个数组记录存着吧. 就不用每次求f(n)的时候都求一遍f(k)(k<n)了
好在才第二题计算量不大..当时的我也根本没意识到严重性看到跑出来就满意的走了
answer 4613732

第三题:
Largest prime factor
Problem 3
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
13195的质因数为5,7,13,29,求600851475143的最大质因数.
求因数、判断质数这一块有许多相应的知识,即便是小学生都能知道这题可以暴搜所有小于等于600851475143/2的数先判断是否为因子再判断是否为质数
(是的当时原始人一样思考的我就是这么做的):
int checkprime(int n)
{
int i;
for (i = 2; i <= sqrt(n); i++)
if (n % i == 0)return 0;
return 1;
}
int main()
{
long long n, larfac = 1;
for (n = 1; n * n < 600851475143 ; n++)
if ((600851475143 % n == 0) && checkprime(n))
if (n > larfac)larfac = n;
cout << larfac;
return 0;
}
因为数字太大所以放了个long long跑了一会跑出来了
显然当时的我好像不懂全局设个数组这种优化概念,这里写个判断质数是o(n^(1/2))主函数又跑了o(n^(1/2))(不知当时的我这么写算不算侥幸这个数的最大质因数恰小于sqrt(n))
比较合理的做法是先确定质因数的上界,再欧拉筛获得这部分的质数,然后从大到小判断是否为因子。(概念诸如欧拉筛一类出于节能考虑懒得放了,查查学学并不难,大致思想就是从2开始循环到n,对每个进行的i如果没有标记就默认为质数,然后再套个循环将i的所有倍数标记为合数,i跑完没有被标记的数就是质数了)
再或者不断将这个数除以质数,当不能整除这个质数时,就检验商是否能整除下一个质数,比如从2开始,n不断整除2,n/(2^k)不能整除2后开始除以3,以此类推循环到不能整除之后的所有质数为止,这样就得到了这个整数的质因数分解。
answer 6857

第四题:
Largest palindrome product
Problem 4
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
9009这样的数字称为回文数,找到由2个三位数乘积得到的值最大的回文数
m×n位数是m+n位数或m+n-1位数 因为就3位数 这题暴搜也不慢
遍历所有2个三位数的乘积判断是否为回文就行了.
int checkp(int A[6])
{
int i;
if (A[0] == 0)
if ((A[1] == A[5]) && (A[2] == A[4]))
return 1;
for ( i = 0; i < 3; i++)
if (A[i] != A[5 - i])break;
if (i == 3)return 1;
return 0;
}
int main()
{
int i, j, k, wei[6], larnum = 0;
for(i=100;i<=999;i++)
for (j = 1; j <= 999; j++)
{
for (k = 0; k < 6; k++)
wei[k] = (i*j / (int)pow(10, 5 - k)) % 10;
if (checkp(wei) && (i * j > larnum))
larnum = i * j;
}
cout << larnum;
return 0;
}
check函数就是判断是否为回文,先不论这个函数是不是写丑了,当时的我在主函数里将数字做成数组的非常的一言难尽...
for (k = 0; k < 6; k++)
wei[k] = (i*j / (int)pow(10, 5 - k)) % 10;
这种写法在数字大时非常容易溢出..建议用while循环每次将n除以10 余10这样存.
例如 这种.
while(n)
{
A[i++]=n/10;
n%=10;
}
暴搜没啥好说的 答案906609

第五题:
Smallest multiple
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?
2520是因子中有1~10中的每一个的最小的数,求因子有1~20的最小的正整数。
不多的能手算的水题....把公因数去一下乘起来即可:
1×2×3×2(4约去公因数2)×5×1(6约去前面的公因数)×7×2(8约去前面的2×2,以此类推)×3×1×11×1×13×1×1×2×17×1×19×1=232792560

水完了,俺累了.不定期更新之后的题吧.