如何求所有素数的和
How do I sum all prime numbers?
我正在做一个练习,将从2到参数的所有素数求和。我已经在代码中工作了这么远,但被卡住了。我相信通过使用拼接函数,我实际上是在跳过一个元素,因为索引发生了变化。
function sumPrimes(num) {
var primearray = [];
var sum = 0;
for(var i =2; i <= num; i++){
primearray.push(i);
}
for(var j = 0; j < primearray.length; j++) {
console.log(primearray[j]);
if ((primearray[j]%2===0) && (primearray[j] >2)) {
primearray.splice(j,1);
} else if ((primearray[j]%3===0) && (primearray[j] > 3)) {
primearray.splice(j,1);
console.log(primearray);
} else if ((primearray[j]%5===0) && (primearray[j] > 5)) {
primearray.splice(j,1);
} else if ((primearray[j]%7===0) && (primearray[j] > 7)) {
primearray.splice(j,1);
}
}
sum = primearray.reduce();
return sum;
}
sumPrimes(30);
我还没有使用reduce函数,因为我仍在处理if-else语句。
我发现了一个很好的解决方案。afmeva很到位。这就是它的工作原理。
function isPrime(val){
//test if number is prime
for(var i=2; i < val; i++){
if(val % i === 0){
return false;
}
}
return true;
}
在上面的代码中,我们接受一个数字来确定它是否是素数。然后我们从2一直循环到我们的数字减1,因为我们知道我们的数字可以被它自己和1整除。如果我们的值与当前循环值的余数为零,那么我们知道它不是素数,所以爆发并这样说
这篇文章很好地解释了
function sumPrimes(num) {
var answer = 0;
//loop through all numbers from 2 to input value
for(var i=2; i <= num; i++){
//sum only prime numbers, skip all others
if(isPrime(i)){
answer += i;
}
}
return answer;
}
sumPrimes(977); // 73156
这是另一个很好的资源
function sumPrimes(num) {
let arr = Array.from({length: num+1}, (v, k) => k).slice(2);
let onlyPrimes = arr.filter( (n) => {
let m = n-1;
while (m > 1 && m >= Math.sqrt(n)) {
if ((n % m) === 0)
return false;
m--;
}
return true;
});
return onlyPrimes.reduce((a,b) => a+b);
}
sumPrimes(977);
我见过很多人把所有素数都放入数组中,为了检查一个数字是否为素数,他们从2到数字进行检查,看看是否有余数。你只需要检查奇数,只需要计数到数字的一半,因为一个数字不能被任何大于它的数字整除。这是我的解决方案:
function sumPrimes(num){
var sum = num>=2?2:0;
for(var i=3;i<=num;i+=2){
var isPrime=true;
for(var j=3;j<(i/2);j++){
if (i%j==0)
{
isPrime=false;
break;
}
}
sum+=isPrime?i:0;
}
return sum;
}
注意:我从j=2开始,因为我们只检查奇数,所以它们永远不会被2整除。
function sumPrimes(num) {
var sumArr= [];
for(var i=0;i<=num;i++){
if(isPrime(i))
sumArr.push(i);
}
sumArr = sumArr.reduce(function(a,b){
return a+b;
})
return sumArr;
}
function isPrime(num) {
if(num < 2) return false;
for (var i = 2; i < num; i++) {
if(num%i === 0)
return false;
}
return true;
}
sumPrimes(10);
这样的东西?
function isPrime(_num) {
for(var i = 2; i < _num; i++) {
if(!(_num % i)) {
return false
}
}
return true;
}
function sumPrimes(_num) {
var sum = 0;
for(var i = 2; i <= _num; i++) {
if(isPrime(i)) {
sum += i;
}
}
return sum;
}
sumPrimes(20) // 77
sumPrimes(5) // 10
您也可以这样做。
function sumPrimes(num) {
var sum = 0;
for (var i = 0; i <= num; i++) {
if (isPrime(i)) {
sum += i;
}
}
return sum;
}
function isPrime(n) {
if (n < 2) { return false; }
if (n !== Math.round(n)) { return false; }
var result = true;
for (var i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
result = false;
}
}
return result;
}
这是我的解决方案。我希望你能发现它很容易理解:
function sumPrimes(num) {
// determine if a number is prime
function isPrime(n) {
if (n === 2) return true;
if (n === 3) return true;
if (n % 2 === 0) return false;
if (n % 3 === 0) return false;
var i = 5;
var w = 2;
while (i * i <= n) {
if (n % i === 0) {
return false;
}
i += w;
w = 6 - w;
}
return true;
}
// subtract 1 for 'not being prime' in my context
var sum = isPrime(num) ? num - 1 : -1;
for (var x = 0; x < num; x++) {
if (isPrime(x) === true) {
sum += x;
}
}
return sum;
}
这里是我对n个素数的和的解决方案
function sumOfNPrimeNumber(num){
var sum = 0;
const isPrime = function(n){
if (isNaN(n) || !isFinite(n) || n%1 || n<2) {
return false;
}
if (n%2==0){
return (n==2);
}
var sqrt = Math.sqrt(n);
for (var i = 3; i < sqrt; i+=2) {
if(n%i == 0){
return false;
}
}
return true;
}
const getNextPrime = function* (){
let nextNumber = 2;
while(true){
if(isPrime(nextNumber)){
yield nextNumber;
}
++nextNumber;
}
}
const nextPrime = getNextPrime();
for (var i = 0; i < num; i++) {
sum = sum + nextPrime.next().value;
}
return sum;
}
console.log(sumOfNPrimeNumber(3));
以上所有答案都使用了辅助函数或不是时间效率函数。这是O(n)时间的快速递归解决方案:
// @ signature int -> int
// @ interpr: returns sum of all prime integers <= num
// assume: num is positive integer
function sumPrimes(num) {
if (num <= 2) {
return 2;
}
let i = 2;
while (i < num) {
if (num % i === 0) {
return sumPrimes(num - 1)
}
i++;
}
return num + sumPrimes(num - 1)
}
// test
sumPrimes(10); // -> 17
function prime_sum(num){
let count=0; *//tracks the no of times number is divided perfectly*
for(let i=1;i<=num;i++){ *//from 1 upto the number*
if(num%i==0){count++};
}
if(count===2){return "Prime"};
return{"Not prime"};
}
console.log(prime_sum(10));//expected output is 17**
//代码接收一个数字,检查范围,如果满足条件
,则返回素数以下解决方案使用Eratosthenes筛对所有小于或等于num
的素数求和。第一个for循环用true
填充大小等于num
的数组。第二个for循环将array
中的所有非素数设置为false
。然后,最后一个for循环简单地遍历array
,以求和数组中的值(即array[i]
)等于true
的所有数组索引i
。
/**
* Sum all primes lower or equal than n.
* Uses the Eratosthenes Sieve to find all primes under n.
*/
function sumPrimes(num) {
let array = [];
let output = 0;
// Fill an array of boolean with 'true' from 2 to n.
for (let i = 0; i <= num; i++) {
array.push(true);
}
// Set all multiples of primes to 'false' in the array.
for (let i = 2; i <= Math.sqrt(num); i++) {
if (array[i]) {
for (let j = i * i; j <= num; j += i) {
array[j] = false;
}
}
}
// All array[i] set to 'true' are primes, so we just need to add them all.
for (var i = 2; i <= num; i++) {
if (array[i]) {
output += i;
}
}
return output;
}
console.log(sumPrimes(10)); // 17
console.log(sumPrimes(977)); // 73156
console.log(sumPrimes(250_000_000)); // 197558914577
function sumPrimes(num) {
let output = 0;
// check if num is a prime number
function isPrime(num) {
for(let i = 2; i < num; i++) {
if(num % i === 0) {
return false;
}
}
return true;
}
for (let i = 2; i <= num; i++) {
if (isPrime(i)) {
output += i;
}
}
return output;
}
console.log(sumPrimes(10)); // 17
这就是我为得到素数所做的。我不知道它是否是最有效的,但它有效。这是用Java编写的,但可以很容易地转换为JavaScript。希望这能帮你指明正确的方向。
final int TOTAL = 10;
int primes[] = new int[TOTAL];
int arrPos = 2;
boolean prime = false;
primes[0] = 2;
for (int i = 2; i < TOTAL; i++) {
prime = false;
int sqrt = (int) Math.sqrt(i);
for (int j = 1; j < arrPos && primes[j] < sqrt; j++) {
if (i % primes[j] != 0) {
prime = true;
} else {
prime = false;
break;
}
}
if (prime == true) {
primes[arrPos] = i;
arrPos++;
}
}
- JavaScript下拉菜单-点击按钮并根据所选值重定向到url
- 使用Javascript获取所选选项ID
- React组件等待所需道具进行渲染
- Angular只从数组中获取所需的数据
- CKFinder 3为所选文件返回错误的URL
- 如何让程序检查所选单词中是否有按键
- 正在获取所选选项数据
- 将所选类别循环到ul>李用加载更多按钮
- 从动态创建的html选择中选择所选选项
- 如何将我的json结构转换为C3.js所需的列结构
- 将单独的数组深层键转换为所需的类型(数组或对象)
- Jquery:如何获取所选选项全文(带空格)
- 如何使用JS禁用表行,并在MYSQL中插入所选选项
- 如何通过所选索引(AngularJS)在模态弹出窗口中显示数据
- 使用纯javascript而非jquery使所选选项卡处于活动状态并保持非活动状态
- 如何选择多个输入字段并删除所需的属性
- 如果在代码末尾进行求值,jQuery-console.log将提供空数组
- 使用 jQuery 从下拉列表中获取所选文本
- 如何解决“;错误所请求的URL返回500-内部服务器错误”;
- 在BootStrap菜单栏中为所选项目设置背景,类似于BootStrap中的父导航选项