那天的题挺简单的

下面来看下

  No1

  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.

//project euler num1
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int main()
{
int sum = 0;
int i;
for(i = 0; i < 1000; i++)
{
if(i % 3 == 0 || i % 5 == 0)
sum += i;
} printf("The sum is %d\n", sum);
}

  第一题很简单,不解释~

  No 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

  第二题是求斐波那契数列小于 4e6 的那些偶数项的和,很简单的想到了递归算法

  

//project euler pro02
#include <iostream>
#include <string>
#include <vector>
using namespace std; int fib_temp[10000];//避免重复运算,算好的项存入数组 int fib(int n)
{
if(n == 1)
{
fib_temp[0] = 1;
return fib_temp[0];
}
else if( n == 0)
{
fib_temp[1] = 2;
return fib_temp[1];
}
else
{
if(fib_temp[n - 1] != 0)
{
if(fib_temp[n - 2] != 0)
return fib_temp[n - 1] + fib_temp[n - 2];//如果已经预存,直接返回
else
fib_temp[n - 2] = fib( n - 2);
return fib_temp[n - 1] + fib_temp[n - 2];
}
else
{
fib_temp[n - 1] = fib(n - 1);
fib_temp[n - 2] = fib(n - 2);
return fib_temp[n - 1] + fib_temp[n - 2];
}
}
} int sum_even_fib(int top_num)
{ int i = 0;
int sum = 0;
int temp = 0;
while(1)
{
if(i % 2 == 0)
{
if((temp = fib(i)) < top_num)
sum += temp;
else
break;
}
i++;
}
return sum;
} int main()
{ int sum = sum_even_fib(400000000);
cout << sum << endl;
return 0;
}

  就是这样,没有选用最基本的递归方法是因为效率过低,不如把算好的想先存入数组,避免重复计算。

  但是这让我想起了之前的动态规划算法:

  递归算法是很简单的自顶向下,从上可以看出是从n一步步的计算到第一项;

  但是动态规划恰恰相反,它是先从第一项开始计算,然后把算好的结果存入数组以备后用。

  //project euler pro02
#include <iostream>
#include <string>
#include <vector>
using namespace std; int fib_temp[10000];
//設立預存數組
int fib(int n)
{
if( n == 0 || n == 1)
{
if(fib_temp[0] == 0)
fib_temp[0] = 1;
if(fib_temp[1] == 0)
fib_temp[1] = 2;
//對前兩項初始化
}
else
{
for(int i = 2; i <= n; i++)
{
if(fib_temp[i] == 0)
fib_temp[i] = fib_temp[i - 1] + fib_temp[i - 2];
//用循環計算後面的項
}
}
return fib_temp[n];
//直接返回數組中的項
} int sum_even_fib(int top_num)
{
int i = 0;
int sum = 0;
int temp = 0;
while(1)
{
if((temp = fib(i)) % 2 == 0)
{
if(temp < top_num)
sum += temp;
else
break;
}
cout << fib(i) << endl;
i++;
}
return sum;
}
int main()
{
int sum = sum_even_fib(4e6);
cout << sum << endl;
return 0;
}

  No3

  The prime factors of 13195 are 5, 7, 13 and 29.

  What is the largest prime factor of the number 600851475143 ?

  我会说就是这个我没有看清楚题么,我看做是求小于这个数的所有素数~

  但是题目是求小于这个数的最大素因子。

  悲伤~~

  好吧,两个都做完了,先看计算最大素因子。

   #include <iostream>
#include <string>
#include <vector>
#include <math.h> using namespace std; bool is_prime(long long int i)
{
long long int j;
for(j = 2; j <= sqrt(i); j ++)
{
if(i % j == 0)
return false;
}
if(j > sqrt(i))
return true;
}
//这是判断素数的 void max_prime_facter(long long int n)
{
if(is_prime(n))
{
cout << n << endl;
return;
//如果n本身就是素数,直接输出
}
for(long long int i = 2; i < (n / 2); ++i)
{
if(n % i == 0)
{
n = n / i;
//如果找到一个小的因子,替换n为n/i
cout << "factor is " << i << endl;
i = 2;
//重置循环变量
if(is_prime(n))
{
cout << n << endl;
//如果在过程中发现n变为了素数,说明
得到了最大的素因子
break;
}
}
}
} int main(int argc, const char *argv[])
{
long long int n = 600851475143;
max_prime_facter(n);
return 0;
}

  看~不难吧。

  那么问题就来了, 挖掘机到底那家强!!

  小扯一下,那么如果我想输出小于这个数的所有素数呢?

  先说一下这个程序的基本思想:

  传统的输出小于这个数的所有素数就是, 

  一个循环,依次判断,但是判断素数是一个很繁琐的事情。

  所以我们就想可不可以把一些数省掉呢?

  首先所有偶数都是合数。

  那么自然而然的就想到了算数基本定理:所有合数都可以表示为素因子的乘积。

   #include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std; bool is_prime(long long int i)
{
for(long long int j = 2; j <= sqrt(i); j ++)
{
if(i % j == 0)
return false;
}
if(i > sqrt(i))
return true;
}
//判断素数的函数
vector<int> vec_prime;
//一个存放素数的数组
void prime_number(long long int n)
{
long long int max;
for (int i = 2; i < n; i++)
{
if(vec_prime.size() != 0)
//一开始数组内是没有元素的
{
vector<int>::iterator it ;
for( it = vec_prime.begin(); it != vec_ prime.end(); ++it)
{
if(i % (*it) == 0)
break;
//依次判断数组内有没有其的因子
}
if(it != vec_prime.end())
continue;
//这表示有他的素因子
}
if(is_prime(i) == true)
//到这里说明数组中没有这个数的因子
//因为我们知道一切正整数都可以表示成素数的乘积
//反之,如果这个数不能表示成素数的乘积
//那么这个数本身很可能就是素数
//所以判断他是否是素数,是的话就加入数组
{
vec_prime.push_back(i);
cout << i << endl;
//依次输出素数
}
}
return ;
} int main()
{ long long int n = 600851475143;
prime_number(n);
return 0;
}

  可以看到这个算法其实是非常快速的~

  补充:

    今早起来突然想到上面的程序是不是还不够快呢~

    可不可以把判断素数的函数省掉呢?

    事实上,判断素数就是多余的。

    因为所有正整数都可以表示为它一组素因子的乘积或者是它本身与 1 的乘积。

  #include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std; bool is_prime(long long int i)
{
for(long long int j = ; j <= sqrt(i); j ++)
{
if(i % j == )
return false;
}
if(i > sqrt(i))
return true;
}
//判断素数的函数
vector<int> vec_prime;
//存入第一个素数
//一个存放素数的数组
void prime_number(long long int n)
{ if(vec_prime.size() == )
vec_prime.push_back(); long long int max;
for (int i = 3; i < n; i += 2)
{
//一开始数组内是没有元素的
vector<int>::iterator it ;
for( it = vec_prime.begin(); it != vec_prime.end(); ++it)
{
if(i % (*it) == )
break;
//依次判断数组内有没有其的因子
}
if(it != vec_prime.end())
continue;
else if(it == vec_prime.end())
{
vec_prime.push_back(i);
cout << i << endl;
}
//这表示有他的素因子
//到这里说明数组中没有这个数的因子
//因为我们知道一切正整数都可以表示成素数的乘积
//反之,如果这个数不能表示成素数的乘积
//那么这个数本身很可能就是素数
//所以判断他是否是素数,是的话就加入数组
//依次输出素数
}
return ;
} int main()
{ long long int n = ;
prime_number(n);
return ;
}

    实验一下发现这个程序还是非常快速的。

    那么我们就得到了这样的程序:

  

  最后再说一下:

  今天学习了c++中的两个新的数据类型long long int 和 _int64.

  参考文章:

  http://www.cnblogs.com/jiai/articles/2613900.html

  http://www.cnblogs.com/felove2013/articles/3880590.html

欧拉计划(1~3)ps:以后看题一定要认真的更多相关文章

  1. 通过欧拉计划学Rust编程(第54题)

    由于研究Libra等数字货币编程技术的需要,学习了一段时间的Rust编程,一不小心刷题上瘾. 刷完欧拉计划中的63道基础题,能学会Rust编程吗? "欧拉计划"的网址: https ...

  2. 【欧拉计划4】Largest palindrome product

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1371281760.html 原创:[欧 ...

  3. 刷完欧拉计划中难度系数为5%的所有63道题,我学会了Rust中的哪些知识点?

    我为什么学Rust? 2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个MOVE是用Rust编写的,看来想准确理解 ...

  4. 用欧拉计划学Rust编程(第26题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...

  5. 通过欧拉计划学习Rust编程(第22~25题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...

  6. 用欧拉计划学Rust语言(第17~21题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...

  7. 用欧拉计划学习Rust编程(第13~16题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...

  8. 用欧拉计划学Rust语言(第7~12题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...

  9. 通过欧拉计划学Rust(第1~6题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以开始了Rust的快速入门学习. 看了一下网上有关Rust的介绍,都 ...

  10. 通过欧拉计划学Rust编程(第500题)

    由于研究Libra等数字货币编程技术的需要,学习了一段时间的Rust编程,一不小心刷题上瘾. "欧拉计划"的网址: https://projecteuler.net 英文如果不过关 ...

随机推荐

  1. java web实现 忘记密码(找回密码)功能及代码

    java web实现 忘记密码(找回密码)功能及代码 (一).总体思路 (二).部分截图 (三).部分代码 (一).总体思路: 1.在 找回密码页面 录入 姓名.邮箱和验证码,录入后点击[提交]按钮, ...

  2. winform datetimepacker 开始日期 结束日期 分类: WinForm 2014-07-15 19:14 124人阅读 评论(0) 收藏

    dtpStart;//开始日期 dtpEnd;//结束日期 1:开始日期小于结束日期 加载dtpEnd的ValueChanged事件即可. //开始日期小于结束日期         private v ...

  3. python 多级菜单 纯循环与分支

    源代码: dic1 = {'湖南':{'衡阳':{'珠晖区':'湖南工学院'},'湘潭':{'晖晖':'啦啦'}}, '北京':{'朝阳': {"德玛:北京大学"}}}print( ...

  4. 在LaTeX里插入全页的pdf 分类: LaTex 2015-02-04 17:20 142人阅读 评论(0) 收藏

    要帮女友排版毕业论文,需要插入封面,省时省力的方法就是把学校给的Word封面保存成PDF然后插入到Latex文档中. 首先添加下面的宏: \usepackage[final]{pdfpages} 然后 ...

  5. Android编程动态创建视图View的方法

    在Android开 发中,在Activity中关联视图View是一般使用setContentView方法,该方法一种参数是使用XML资源直接创 建:setContentView (int layout ...

  6. RPM命令用法详解

    RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证. 下面我们就来逐一的讲解吧. 一. 安装RPM包 RPM 软件包通常具有类似foo-1.0-1.i386.rp ...

  7. Objective-c Category使用

    Objective-c  Category使用 转载:http://blog.csdn.net/lovefqing/article/details/8289851 什么是Category Catego ...

  8. 动态代理与AOP

    1. 代理的分类: 静态代理:每个代理类只能为一个接口服务 动态代理:可以通过一个代理类完成全部的代理功能(由JVM生成实现一系列接口的代理类,即:生成实现接口的类的代理) 2. 动态代理: 在Jav ...

  9. SQLite查询优化性能要点

    Sqlite是轻量级的,在编译之后很小,其中一个原因就是在查询优化方面比较简单,它只是运用索引机制来进行优化的,经过对SQLite的查询优化的分析以及对源代码的研究,我将SQLite的查询优总结如下: ...

  10. 权限系统与RBAC模型概述

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3793894.html ...