Files

180 lines
11 KiB
Markdown
Raw Normal View History

2018-10-12 16:00:59 -04:00
---
title: Sum All Primes
localeTitle: Сумма всех чисел
---
![:triangular_flag_on_post:](https://forum.freecodecamp.com/images/emoji/emoji_one/triangular_flag_on_post.png?v=3 ": Triangular_flag_on_post:") Не забудьте использовать **`Read-Search-Ask`** если вы застряли. Попробуйте подключить программу ![:busts_in_silhouette:](https://forum.freecodecamp.com/images/emoji/emoji_one/busts_in_silhouette.png?v=3 ": Busts_in_silhouette:") и напишите свой собственный код ![:pencil:](https://forum.freecodecamp.com/images/emoji/emoji_one/pencil.png?v=3 ":карандаш:")
### ![:checkered_flag:](https://forum.freecodecamp.com/images/emoji/emoji_one/checkered_flag.png?v=3 ": Checkered_flag:") Проблема Объяснение:
Объяснение этой проблемы очень просто. Вы сгенерируете список простых чисел до числа, которое вы укажете в качестве параметра. Затем вам нужно добавить их все и вернуть это значение. Сложная часть заключается в создании списка простых чисел. Я предлагаю вам найти код или хороший математический алгоритм, который вы можете превратить в код.
#### Связанные ссылки
* [Простые числа](https://en.wikipedia.org/wiki/Prime_number)
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": Speech_balloon:") Подсказка: 1
Создайте список всех номеров до и включая тот, который вы получили в качестве параметра. Это необходимо для определения того, какие числа являются первичными или нет.
> _попытаться решить проблему сейчас_
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": Speech_balloon:") Подсказка: 2
Проверьте эту [ссылку,](https://stackoverflow.com/questions/11966520/how-to-find-prime-numbers-between-0-100) если вы предпочитаете находить решение для поиска простых чисел или пытаетесь изучить и внедрить свое собственное [Сито Эратосфена](https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)
> _попытаться решить проблему сейчас_
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": Speech_balloon:") Подсказка: 3
Эта проблема сложна, если вам нужно создать свой собственный код для проверки простых чисел, поэтому не чувствуйте себя плохо, если вам нужно использовать чей-то код для этого бита. В любом случае, вы, скорее всего, используете массив, поэтому, как только вы создадите массив простых чисел, просто добавьте их и верните номер, который вы получите.
> _попытаться решить проблему сейчас_
## Осторожно, спойлеры!
![предупреждающий знак](//discourse-user-assets.s3.amazonaws.com/original/2X/2/2d6c412a50797771301e7ceabd554cef4edcd74d.gif)
**Решение впереди!**
## ![:beginner:](https://forum.freecodecamp.com/images/emoji/emoji_one/beginner.png?v=3 ": Начинающий:") Решение базового кода:
```
function sumPrimes(num) {
var res = 0;
// Function to get the primes up to max in an array
function getPrimes(max) {
var sieve = [];
var i;
var j;
var primes = [];
for (i = 2; i <= max; ++i) {
if (!sieve[i]) {
// i has not been marked -- it is prime
primes.push(i);
for (j = i << 1; j <= max; j += i) {
sieve[j] = true;
}
}
}
return primes;
}
// Add the primes
var primes = getPrimes(num);
for (var p = 0; p < primes.length; p++) {
res += primes[p];
}
return res;
}
// test here
sumPrimes(10);
```
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:") [Код запуска](https://repl.it/CLnZ/0)
### Код Объяснение:
* Создайте функцию, которая генерирует числа от 1 до **num** и проверяет, являются ли они первыми на этом пути.
* Объявите переменные, которые понадобятся.
* Начните с 2, если он не был помечен и добавлен в решетку сита, то он является простым и мы добавляем его в простой массив.
* Добавьте остальные в решетку решета.
* Вернуть простые числа
* Прокрутите возвращаемый массив и добавьте все элементы, чтобы затем вернуть окончательное значение.
#### Связанные ссылки
* [JS для пояснений](https://forum.freecodecamp.com/t/javascript-for-loop/14666s-Explained)
## ![:sunflower:](https://forum.freecodecamp.com/images/emoji/emoji_one/sunflower.png?v=3 ": Подсолнечное:") Решение промежуточного кода:
```
function sumPrimes(num) {
// function to check if the number presented is prime
function isPrime(number){
for (i = 2; i <= number; i++){
if(number % i === 0 && number!= i){
// return true if it is divisible by any number that is not itself.
return false;
}
}
// if it passes the for loops conditions it is a prime
return true;
}
// 1 is not a prime, so return nothing, also stops the recursive calls.
if (num === 1){
return 0;
}
// Check if your number is not prime
if(isPrime(num) === false){
// for non primes check the next number down from your maximum number, do not add anything to your answer
return sumPrimes(num - 1);
}
// Check if your number is prime
if(isPrime(num) === true){
// for primes add that number to the next number in the sequence through a recursive call to our sumPrimes function.
return num + sumPrimes(num - 1);
}
}
// test here
sumPrimes(10);
```
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:") [Код запуска](https://repl.it/CLn0/0)
### Код Объяснение:
* Функция `isPrime` проверяет, является ли конкретное число простым или нет.
* Если `num` равно 1, верните 0, так как 1 не является простым числом.
* Если **num** не является простым, проверьте следующее число с максимального числа.
* Если **num** является простым, добавьте его к следующему номеру в последовательности через рекурсию в функцию `sumPrimes` .
#### Связанные ссылки
* [Функции - Рекурсия](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Recursion)
## ![:rotating_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/rotating_light.png?v=3 ": Rotating_light:") Расширенное решение для кода:
```
function sumPrimes(num) {
// step 1
let arr = Array.from({length: num+1}, (v, k) => k).slice(2);
// step 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;
});
// step 3
return onlyPrimes.reduce((a,b) => a+b);
}
// test here
sumPrimes(977);
```
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:") [Код запуска](https://repl.it/DoOo/3)
### Код Объяснение:
* **Шаг 1.** Используйте `Array.from()` для генерации последовательности чисел до и включите `num` . Объедините с `.slice()` чтобы `.slice()` первые два индекса `[0, 1]` поскольку все простые числа должны быть больше 1.
* **Шаг 2:** Отфильтруйте все числа от `arr` , которые не являются первичными, подвергая каждый элемент _«пробному делению»,_ который состоит из деления n на каждое целое число m, которое больше 1 и меньше или равно квадратному корню из n "_ . Этот тест возвращает `false` если любое число, меньшее, чем элемент, который работает (m), не дает остатка, когда указанный элемент (n) делится на него. Подробнее см. Ссылку ниже.
* **Шаг 3.** Возвращаем сумму всех оставшихся элементов arr, используя `.reduce()` .
### Связанные ссылки
* [Испытание пробного дивизиона](https://en.wikipedia.org/wiki/Prime_number#Trial_division)
* [Array.from ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Examples)
* [Array.filter ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
## ![:clipboard:](https://forum.freecodecamp.com/images/emoji/emoji_one/clipboard.png?v=3 ": Буфер обмена:") ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:
* ![:warning:](https://forum.freecodecamp.com/images/emoji/emoji_one/warning.png?v=3 ":предупреждение:") **НЕ** добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это **_похоже, но лучше_** , попробуйте объединить (или заменить) существующее подобное решение.
* Добавьте объяснение своего решения.
* Классифицируйте решение в одной из следующих категорий - **Basic** , **Intermediate** и **Advanced** . ![:traffic_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/traffic_light.png?v=3 ":светофор:")
> Видеть ![:point_right:](https://forum.freecodecamp.com/images/emoji/emoji_one/point_right.png?v=3 ": Point_right:") [**`Wiki Challenge Solution Template`**](https://forum.freecodecamp.com/t/algorithm-article-template/14272) для [**`Wiki Challenge Solution Template`**](https://forum.freecodecamp.com/t/algorithm-article-template/14272) для справки.