那天的题挺简单的

下面来看下

  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.

  1. //project euler num1
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. int main()
  7. {
  8. int sum = 0;
  9. int i;
  10. for(i = 0; i < 1000; i++)
  11. {
  12. if(i % 3 == 0 || i % 5 == 0)
  13. sum += i;
  14. }
  15.  
  16. printf("The sum is %d\n", sum);
  17. }

  第一题很简单,不解释~

  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 的那些偶数项的和,很简单的想到了递归算法

  

  1. //project euler pro02
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. int fib_temp[10000];//避免重复运算,算好的项存入数组
  8.  
  9. int fib(int n)
  10. {
  11. if(n == 1)
  12. {
  13. fib_temp[0] = 1;
  14. return fib_temp[0];
  15. }
  16. else if( n == 0)
  17. {
  18. fib_temp[1] = 2;
  19. return fib_temp[1];
  20. }
  21. else
  22. {
  23. if(fib_temp[n - 1] != 0)
  24. {
  25. if(fib_temp[n - 2] != 0)
  26. return fib_temp[n - 1] + fib_temp[n - 2];//如果已经预存,直接返回
  27. else
  28. fib_temp[n - 2] = fib( n - 2);
  29. return fib_temp[n - 1] + fib_temp[n - 2];
  30. }
  31. else
  32. {
  33. fib_temp[n - 1] = fib(n - 1);
  34. fib_temp[n - 2] = fib(n - 2);
  35. return fib_temp[n - 1] + fib_temp[n - 2];
  36. }
  37. }
  38. }
  39.  
  40. int sum_even_fib(int top_num)
  41. {
  42.  
  43. int i = 0;
  44. int sum = 0;
  45. int temp = 0;
  46. while(1)
  47. {
  48. if(i % 2 == 0)
  49. {
  50. if((temp = fib(i)) < top_num)
  51. sum += temp;
  52. else
  53. break;
  54. }
  55. i++;
  56. }
  57. return sum;
  58. }
  59.  
  60. int main()
  61. {
  62.  
  63. int sum = sum_even_fib(400000000);
  64. cout << sum << endl;
  65. return 0;
  66. }

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

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

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

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

  1. //project euler pro02
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. int fib_temp[10000];
  8. //設立預存數組
  9. int fib(int n)
  10. {
  11. if( n == 0 || n == 1)
  12. {
  13. if(fib_temp[0] == 0)
  14. fib_temp[0] = 1;
  15. if(fib_temp[1] == 0)
  16. fib_temp[1] = 2;
  17. //對前兩項初始化
  18. }
  19. else
  20. {
  21. for(int i = 2; i <= n; i++)
  22. {
  23. if(fib_temp[i] == 0)
  24. fib_temp[i] = fib_temp[i - 1] + fib_temp[i - 2];
  25. //用循環計算後面的項
  26. }
  27. }
  28. return fib_temp[n];
  29. //直接返回數組中的項
  30. }
  31.  
  32. int sum_even_fib(int top_num)
  33. {
  34. int i = 0;
  35. int sum = 0;
  36. int temp = 0;
  37. while(1)
  38. {
  39. if((temp = fib(i)) % 2 == 0)
  40. {
  41. if(temp < top_num)
  42. sum += temp;
  43. else
  44. break;
  45. }
  46. cout << fib(i) << endl;
  47. i++;
  48. }
  49. return sum;
  50. }
  51. int main()
  52. {
  53. int sum = sum_even_fib(4e6);
  54. cout << sum << endl;
  55. return 0;
  56. }

  No3

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

  What is the largest prime factor of the number 600851475143 ?

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

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

  悲伤~~

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

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <math.h>
  5.  
  6. using namespace std;
  7.  
  8. bool is_prime(long long int i)
  9. {
  10. long long int j;
  11. for(j = 2; j <= sqrt(i); j ++)
  12. {
  13. if(i % j == 0)
  14. return false;
  15. }
  16. if(j > sqrt(i))
  17. return true;
  18. }
  19. //这是判断素数的
  20.  
  21. void max_prime_facter(long long int n)
  22. {
  23. if(is_prime(n))
  24. {
  25. cout << n << endl;
  26. return;
  27. //如果n本身就是素数,直接输出
  28. }
  29. for(long long int i = 2; i < (n / 2); ++i)
  30. {
  31. if(n % i == 0)
  32. {
  33. n = n / i;
  34. //如果找到一个小的因子,替换n为n/i
  35. cout << "factor is " << i << endl;
  36. i = 2;
  37. //重置循环变量
  38. if(is_prime(n))
  39. {
  40. cout << n << endl;
  41. //如果在过程中发现n变为了素数,说明
  42. 得到了最大的素因子
  43. break;
  44. }
  45. }
  46. }
  47. }
  48.  
  49. int main(int argc, const char *argv[])
  50. {
  51. long long int n = 600851475143;
  52. max_prime_facter(n);
  53. return 0;
  54. }

  看~不难吧。

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

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

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

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

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

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

  首先所有偶数都是合数。

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

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <math.h>
  8. using namespace std;
  9.  
  10. bool is_prime(long long int i)
  11. {
  12. for(long long int j = 2; j <= sqrt(i); j ++)
  13. {
  14. if(i % j == 0)
  15. return false;
  16. }
  17. if(i > sqrt(i))
  18. return true;
  19. }
  20. //判断素数的函数
  21. vector<int> vec_prime;
  22. //一个存放素数的数组
  23. void prime_number(long long int n)
  24. {
  25. long long int max;
  26. for (int i = 2; i < n; i++)
  27. {
  28. if(vec_prime.size() != 0)
  29. //一开始数组内是没有元素的
  30. {
  31. vector<int>::iterator it ;
  32. for( it = vec_prime.begin(); it != vec_ prime.end(); ++it)
  33. {
  34. if(i % (*it) == 0)
  35. break;
  36. //依次判断数组内有没有其的因子
  37. }
  38. if(it != vec_prime.end())
  39. continue;
  40. //这表示有他的素因子
  41. }
  42. if(is_prime(i) == true)
  43. //到这里说明数组中没有这个数的因子
  44. //因为我们知道一切正整数都可以表示成素数的乘积
  45. //反之,如果这个数不能表示成素数的乘积
  46. //那么这个数本身很可能就是素数
  47. //所以判断他是否是素数,是的话就加入数组
  48. {
  49. vec_prime.push_back(i);
  50. cout << i << endl;
  51. //依次输出素数
  52. }
  53. }
  54. return ;
  55. }
  56.  
  57. int main()
  58. {
  59.  
  60. long long int n = 600851475143;
  61. prime_number(n);
  62. return 0;
  63. }

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

  补充:

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

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

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

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

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <math.h>
  8. using namespace std;
  9.  
  10. bool is_prime(long long int i)
  11. {
  12. for(long long int j = ; j <= sqrt(i); j ++)
  13. {
  14. if(i % j == )
  15. return false;
  16. }
  17. if(i > sqrt(i))
  18. return true;
  19. }
  20. //判断素数的函数
  21. vector<int> vec_prime;
  22. //存入第一个素数
  23. //一个存放素数的数组
  24. void prime_number(long long int n)
  25. {
  26.  
  27. if(vec_prime.size() == )
  28. vec_prime.push_back();
  29.  
  30. long long int max;
  31. for (int i = 3; i < n; i += 2)
  32. {
  33. //一开始数组内是没有元素的
  34. vector<int>::iterator it ;
  35. for( it = vec_prime.begin(); it != vec_prime.end(); ++it)
  36. {
  37. if(i % (*it) == )
  38. break;
  39. //依次判断数组内有没有其的因子
  40. }
  41. if(it != vec_prime.end())
  42. continue;
  43. else if(it == vec_prime.end())
  44. {
  45. vec_prime.push_back(i);
  46. cout << i << endl;
  47. }
  48. //这表示有他的素因子
  49. //到这里说明数组中没有这个数的因子
  50. //因为我们知道一切正整数都可以表示成素数的乘积
  51. //反之,如果这个数不能表示成素数的乘积
  52. //那么这个数本身很可能就是素数
  53. //所以判断他是否是素数,是的话就加入数组
  54. //依次输出素数
  55. }
  56. return ;
  57. }
  58.  
  59. int main()
  60. {
  61.  
  62. long long int n = ;
  63. prime_number(n);
  64. return ;
  65. }

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

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

  

  最后再说一下:

  今天学习了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. xml学习篇(二) ----JSON 和XML对比

    在比较JSON和XML之前,我们先来上一堂关于数据格式的简要历史(更准确的说,是关于XML的始祖): 早在1970年,IBM开发了一种叫Generalized Markup Language的标记语言 ...

  2. css开发经验&错误习惯

    CSS开发经验 1.尽量用class来定义样式.尽量少使用  .div1 ul li{}这样的样式下去,因为如果li里面还有<div><ul><li>这些元素的话会 ...

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

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

  4. Qt 学习之路 :菜单栏、工具栏和状态栏

    在之前的<添加动作>一文中,我们已经了解了,Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示.QAction可以添加到菜单上.工具栏上.期间,我们还详细介绍了一 ...

  5. Bash关闭输出(关闭正确、错误输出)

    利用&>重定向,不输出任何内容: echo hello &> /dev/null 关闭正确输出: echo hello 1> /dev/null 关闭错误输出: ec ...

  6. oracle 异常管理

    命名的系统异常                  产生原因 access_into_null 未定义对象 CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE ...

  7. WPF 媒体播放器(MediaElement)实例,实现进度和音量控制

    WPF 视频音频播放控件MediaElement实现进度控制,音量控制实例 说明: 1.Volume控制音量的大小,double类型,并且实现了属性依赖,可以用来双向绑定:在 0 和 1. 之间的线性 ...

  8. Android EditText自动弹出输入法焦点

    http://mobile.51cto.com/aprogram-403138.htm 1. 看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的 ...

  9. IDEA SVN1.8 问题解决

    转自 http://blog.jetbrains.com/idea/2013/12/subversion-1-8-and-intellij-idea-13/

  10. ios-pch文件的手动添加

    Xcode6添加pch文件 前言:Xcode6中不在为开发者自动创建pch文件,在pch文件中我们可以添加一些琐碎的宏定义,在项目中任何地方都可以引用,加快了编译的速度 Xcode6之后的版本都是需要 ...