Sum All Primes

题目

求小于等于给定数值的质数之和。

只有 1 和它本身两个约数的数叫质数。例如,2 是质数,因为它只能被 1 和 2 整除。1 不是质数,因为它只能被自身整除。

给定的数不一定是质数。

测试用例:

sumPrimes(10) 应该返回一个数字。

sumPrimes(10) 应该返回 17。

sumPrimes(977) 应该返回 73156。


思路

质数,也叫素数。定义:约数只有1和他本身的数。举个栗子:2,3,5,7...

一般的判断条件写作循环2到他本身,而求小于等于给定数值的质数之和只需要从2循环到他本身即可

 1 function sumPrimes(num) {
 2     var sum=0;
 3     for (var i = 2; i <= num; i++) {
 4         var isPN=true;
 5         for(var j=2;j<i;j++){
 6             if(i%j==0){
 7                 isPN=false;
 8                 break;
 9             }
10         }
11         if(isPN) sum+=i;
12     }
13 }

但这对于大数值的计算过程将是漫长的,所以我们可以对以上算法作出一定的优化。到这里我猜有人就会问了,作为一个前端为什么还要懂算法或者说要学会对算法进行优化?如果你已经对本文持怀疑态度那你可以点击右上角红叉了,谢谢

看来你已经决定留下来了。那我们应该怎样对以上算法进行优化操作?先卖个关子。

约数总是成对的存在。以下格式为[A,B] 数值本身简写为N

举个栗子:6,我挺喜欢的一个数字,毕竟我6666。嗯...说正事,6的约数对有两种情况[1,6] [2,3]。

再举个栗子16,约数对可以解析为[1,16] [2,8] [4,4]

为什么没有[8,2]甚至[16,1]呢,因为从对数上来说[2,8]和[8,2]是相等的。那么意味着什么?意味我是吴彦祖吗?对的我就是。除了这个结论同时还意味着我们在判断2是否可以被16整除后可以跳过8是否被16整除。但是应该从2循环到哪里呢?

我们再来看几个栗子,9可以解析为[1,9] [3,3]  25解析为[1,25] [5,5].........发现了吗?

我们应该避免的是约数中A比B大,因为如果A比B大了在A可以被整除后说明这个约数对我们是必定计算过的,这只是重复造轮子增加内存的消耗而已。

不信你看24 约数对可以分为[1,24] [2,12] [3,8] [4,6] 这就是24的全部约数对了。怎么验证?可以让A继续增长,[6,4] [12,2] [24,1] 这些是我们上面全部计算过的内容了,只是换了一下顺序。

所以我们可以循环2-A的最大值就行了,A的最大值就是在AB一样大的时候,见 25 16 9。那么A什么时候与B一样大?没错就是√N

所以可以得出一个结论,在N只需要判断2到√N是否能整除就行了。只需要把第二个循环的i转变成√i即可。√在代码中为Math.sqrt(X),也可以用A*A<=N代替

有同学就问了,为什么要这么麻烦?在碰到能够整除的数值直接跳出不就行了吗?

再举个栗子:49999一个质数,在按原本的算法循环应该是判断2-49998是否能被49999整除。而使用了√后,只需要判断2-223(√49999<224)是否能被49999整除即可。数值越大优化越明显

本期关于质数的一点小优化到此为止,过几天会有进阶版的优化,有兴趣的可以移步一观:)

时间: 2024-10-26 14:57:58

Sum All Primes的相关文章

Prime counting,sum of primes,leetcode,dp.

主要参考 http://www.zhihu.com/question/29580448/answer/45218281 https://projecteuler.net/thread=10;page=5   Lucy_Hedgehog 的代码 如果不用map,自己写hash函数会更快 // 计算 Π(n-1)class Solution { public: int countPrimes(int n) { n--; if(n<=1) return 0; int r = int(sqrt(n));

大素数筛子

题目地址:http://acm.fafu.edu.cn/problem.php?id=1011 Description: The problem is very simple,your job is just to calculate the sum of primes from the first prime to the Nth prime. Input: The input consists multiple cases. Each line contains a N(1<=N<=100

例题10-4 最小公倍数的最小和 UVa10791

1.题目描述:点击打开链接 2.解题思路:本题要求找至少两个整数,使得它们的最小公倍数是n.本题看似简单,但还是应该注意细节,考虑周密.当n=1时答案是2,当n只有一种素因子时答案是n+1,由于n的最大范围是2^31-1,因此保险起见用long long防止溢出. 3.代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include&l

FCC 中级算法题 所有素数之和

Sum All Primes 求小于等于给定数值的质数之和. 只有 1 和它本身两个约数的数叫质数.例如,2 是质数,因为它只能被 1 和 2 整除.1 不是质数,因为它只能被自身整除. 给定的数不一定是质数. For Loops Array.push() 思路: 找出从0到num之间所有的质数,然后遍历累加: 知识点: 质数除2到自己本身(不包含)都不会整除: 失误: 我把拿来确定a是否可以整除的b放到了全局中,这导致a每次循环但b的值不会变化,后来我将b声明到了a的循环中: 代码: 1 fu

Project Euler 77:Prime summations

原题: Prime summations It is possible to write ten as the sum of primes in exactly five different ways: 7 + 35 + 55 + 3 + 23 + 3 + 2 + 22 + 2 + 2 + 2 + 2 What is the first value which can be written as the sum of primes in over five thousand different

快速求素数和

在知乎上看到一个问题:求十亿内所有质数的和,怎么做最快? 记录一下第一回答 定义为到所有整数中,在普通筛法中外层循环筛完时仍然幸存的数的和.因此这些数要不本身是素数,要不其最小的素因子也大于.因此我们需要求的是,其中是十亿. 为了计算,先考虑几个特殊情况 .此时所有数都还没有被筛掉,所以 不是素数.因为筛法中早已被别的数筛掉,所以在这步什么都不会做,所以此时: 是素数,但是.因为每个合数都一定有一个不超过其平方根的素因子,如果筛到时还没筛掉一个数,那么筛到时这个数也还在.所以此时也有. 现在考虑

Project Euler:Problem 77 Prime summations

It is possible to write ten as the sum of primes in exactly five different ways: 7 + 3 5 + 5 5 + 3 + 2 3 + 3 + 2 + 2 2 + 2 + 2 + 2 + 2 What is the first value which can be written as the sum of primes in over five thousand different ways? #include <i

python并行计算的简单实现--pp

python多线程最出名的是 mutilprocessing (mp) 然而我推荐一个第三方的包, 它的实现比mp 简单地多, 只需要一句话 job = job_server.submit(function, (paras,), (called-functions,), (imports,)) 非常容易理解, 1. function是你需要并行计算的函数, 2. paras是实参, 3. called-functions 是function中调用的其他函数, 如果没有, 则不填. 4. impo

FreeCodeCamp( FCC)前端工程师 中级算法练习 分析与解答(全)(精)

[TOC] 说在前面 这是要一篇非常简单的新手能看懂的文章,希望你喜欢.由于在 freecodecamp 中貌似!?无法使用 ES6 的某些语法,未测试具体.所以基本上用古老?!的ES5,4写成,谢谢.在写本博文前没有参考过别人的做法,纯手打,我的方法肯定不是最好,只是以我自己喜欢的方式在写而已. 纯原创,转载请联系作者https//:[email protected].[email protected]. freecodecamp China 不明白API请参考MDN给出的解释 个别题目没有判