欧拉计划 NO05 ps:4题想过,好做,但麻烦,有时间补充,这题也不难!

问题重述:  

  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?

  问题的意思是找出可以整除小于等于某个数的所有公倍数,给出的测试用例是可以整除小于等于10的最小公倍数是2520,求

  出可以整除小于等于20的最小公倍数(只针对正整数)。

  思想:

    先想一下如果不考虑计算时间,最简单的办法就是找出一个范围,让这个范围的数挨个对1~20内的数整除,但是问题就是

  这个范围到底怎么找,一个简单的想法就是,最后的答案肯定小于20!,大于小于20所有素数的乘积。

    想到这里我突然想起前面几个关于素数的问题,可不可以借助前面的想法呢?答案肯定是可以的。

    先考虑这样一个问题2,3的最小公倍数是6,就是3和2的乘积;6和8的最小公倍数却是24,不是6和8的乘积,这里的问题出

  在6和8有公因子,而2和3却没有,那么根据这个想法可以处理这个问题,假设现在有个数接近他的最小倍数,如果这个数是合数

  那么可能这个数乘以他的因子就可以整除了。代码如下:

my solution is written by c++, work for any range!
  1 #include <iostream>
  2 #include <string>
  3 #include <vector>
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <math.h>
  7 using namespace std;
  8
  9
 10 int least_common_multiple(int num)
 11 {
 12     int common = 1;//初始化最小公倍数
 13     for (int i = 2; i <= num; i++)
 14     {
 15         if(common % i != 0)//如果不能整除则说明里面有common要乘的因子
 16         {
 17             int temp = i;
 18             for (int j = 2; j <= (int)sqrt(i); j++)//求素因子
 19             {
 20                 if(temp % j == 0)
 21                 {
 22                     if((temp / j) == 1)
 23                         continue;
 24                     temp = temp / j;
 25                     j = 1;//如果找到一个因子,重置j
 26                 }
 27             }
 28             cout <<i << "   "<< temp << endl;//打印出它每次要乘的因子
 29             common *= temp;//公倍数乘以素数部分
 30         }
 31     }
 32
 33     return common;
 34 }
 35
 36
 37 int main(int argc, const char *argv[])
 38 {
 39     int num = atoi(argv[1]);
 40     cout << "num: "<<num  << " " << (int)sqrt(8)<< endl;
 41     cout << least_common_multiple(num) << endl;
 42     return 0;
 43 }
if you want to use my solution. please delete line number before complie 

  这次程序的速度还是相当快的

  当num为10,common为2520

  当num为30,common为2329089562800

  注意当num为30时,最小公倍数已经超出int类型的范围,建议使用long long int。

时间: 2024-11-20 10:17:05

欧拉计划 NO05 ps:4题想过,好做,但麻烦,有时间补充,这题也不难!的相关文章

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

最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以开始了Rust的快速入门学习. 看了一下网上有关Rust的介绍,都说它的学习曲线相当陡峭,曾一度被其吓着,后来发现Rust借鉴了Haskell等函数式编程语言的优点,而我以前专门学习过Haskell,经过一段时间的入门学习,我现在已经喜欢上这门神奇的语言. 入门资料我用官方的<The Rust Programming Language>,非常权威,配合着<

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

最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有反馈,尤其是学英语.学编程的时候,一定要"用",学习编程时有一个非常有用的网站,它就是"欧拉计划",网址: https://projecteuler.net 这个网站提供了几百道由易到难的数学问题,你可以用任何办法去解决它,当然主要还得靠编程,编程语言不限,论坛里已经有

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

由于研究Libra等数字货币编程技术的需要,学习了一段时间的Rust编程,一不小心刷题上瘾. 刷完欧拉计划中的63道基础题,能学会Rust编程吗? "欧拉计划"的网址: https://projecteuler.net 英文如果不过关,可以到中文翻译的网站: http://pe-cn.github.io/ 这个网站提供了几百道由易到难的数学问题,你可以用任何办法去解决它,当然主要还得靠编程,编程语言不限,论坛里已经有Java.C#.Python.Lisp.Haskell等各种解法,当然

欧拉计划21-23题

21.Amicable numbers Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n). If d(a) = b and d(b) = a, where a  b, then a and b are an amicable pair and each of a and b are called amicable numbers. For

欧拉计划16-20题

16.Power digit sum 215 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26. What is the sum of the digits of the number 21000? 题目大意: 215 = 32768 并且其各位之和为 is 3 + 2 + 7 + 6 + 8 = 26. 21000 的各位数之和是多少? #include <stdio.h> #include <stdbool.h&g

欧拉计划(Euler Project)——第一题到第三题

题目一: 10以下的自然数中,属于3和5的倍数的有3,5,6和9,它们之和是23. 找出1000以下的自然数中,属于3和5的倍数的数字之和. package Blog1; public class First { /** * 10以下的自然数中,属于3和5的倍数的有3,5,6和9,它们之和是23.找出1000以下的自然数中,属于3和5的倍数的数字之和. */ public static void main(String[] args) { int sum=0; for (int i=0;i<10

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

我为什么学Rust? 2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个MOVE是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以又开始了Rust的快速入门学习. 欧拉计划 看了一下网上有关Rust的介绍,都说它的学习曲线相当陡峭,曾一度被其吓着,后来发现Rust借鉴了Haskell等函数式编程语言的优点,而我以前专门学习过Haskell,经过一段时间的入门学习,我现在已经喜欢

欧拉计划013(ProjectEuler013):求出10个数乘积最大的

申明:之前的所有欧拉计划都是用python来写的,的确python来写,代码量极少,学习起来也很方便.但是最近为了找java工作,所以用Java来完成欧拉计划的题,来复习一下Java. Large sum Problem 13 Work out the first ten digits of the sum of the following one-hundred 50-digit numbers. 371072875339021027987979982208375902465101357402

欧拉计划记录帖

记录一下自己刷(水)欧拉计划的题目,(=?ω?=). (每天一两道,胜过做神仙!) 1.2/27日 前15道KO 基本都是暴力水题,第15道是道组合数学. 2.2/28日 今天要把25题的那个成就打出来! 原文地址:https://www.cnblogs.com/Leonard-/p/8485463.html