Сумма всех простых чисел от 1 до N в Python

Я новичок в программировании. Пытаясь решить эту проблему, я получаю неправильный ответ. Я проверял свой код несколько раз, но не смог определить ошибку. Пожалуйста, помогите мне с этой простой проблемой. Проблема в следующем:

Given a positive integer N, calculate the sum of all prime numbers between 1 and N (inclusive). The first line of input contains an integer T denoting the number of test cases. T testcases follow. Each testcase contains one line of input containing N. For each testcase, in a new line, print the sum of all prime numbers between 1 and N.

И мой код:

from math import sqrt 
sum = 0
test = int(input())
for i in range(test):
    max = int(input())
    if max==1:
        sum = 0
    elif max==2:
        sum += 2
    else:    
        sum = sum + 2
        for x in range(3,max+1):
            half = int(sqrt(max)) + 1
            for y in range(2,half):
                res = x%y
                if res==0:
                    sum = sum + x
                    break
    print(sum)     

Для ввода 5 и 10 мой код дает результат 6 и 48 соответственно, а правильный ответ - 10 и 17 соответственно. Пожалуйста, выясните ошибку в моем коде.

Возможный дубликат Как найти сумму простых чисел в заданном диапазоне в Python 3.5?

Anderson Green 27.12.2018 05:02

Спасибо, @AndersonGreen. Но я хочу знать ошибку в моем коде.

SySu 27.12.2018 05:09

См. Эту реализацию сито

Chiheb Nexus 27.12.2018 05:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
7 758
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Прежде всего, объявите сумму равной нулю в начале цикла for i.

Проблема заключается в операторе if почти в самом конце кода, когда вы добавляете x к сумме, если res равно нулю, что означает, что число действительно не является простым числом. Вы можете видеть, что это так, потому что вы получаете результат 6 при вводе 5, поскольку единственное непростое число в диапазоне от 1 до 5 включительно - 4, и вы уже добавляете 2 к сумме в начале.

И последнее, но не менее важное: вам следует изменить

half = int(sqrt(max)) + 1

линия к

half = int(sqrt(x)) + 1

Попробуйте поработать с предоставленной мной информацией и исправить код самостоятельно. Вы узнаете больше всего, не копируя чужой код.

Удачного кодирования!

Я считаю, что ошибка в вашем коде могла быть вызвана следующими строками кода:

for x in range(3,max+1):
        half = int(sqrt(max)) + 1

Поскольку вы используете цикл с использованием x, вам следует изменить int (sqrt (max)) на int (sqrt (x)) следующим образом:

for x in range(3,max+1):
        half = int(sqrt(x)) + 1

Ваш код пытается увидеть, является ли max простым N раз, при этом вы должны видеть, является ли вместо этого каждое число от 1 до N простым.

Я впервые отвечаю на вопрос, поэтому, если вам понадобится дополнительная помощь, просто дайте мне знать.

Предлагаемое изменение кода необходимо, но его недостаточно для исправления программы OP.

cdlane 27.12.2018 06:11

Здесь я реализовал простую программу, чтобы найти сумму всех простых чисел от 1 до n. Рассмотрим primeAddition () как функцию, а ip как входной параметр. Это может помочь вам решить вашу проблему. Попробуйте.

Фрагмент кода:

def primeAddition(ip): 
    # list to store prime numbers...
    prime = [True] * (ip + 1) 

    p = 2
    while p * p <= ip: 
        # If prime[p] is not changed, then it is a prime...
        if prime[p] == True: 
            # Update all multiples of p...
            i = p * 2
            while i <= ip: 
                prime[i] = False
                i += p 
        p += 1    

    # Return sum of prime numbers...
    sum = 0
    for i in range (2, ip + 1): 
        if (prime[i]): 
            sum += i 
    return sum

#The program is ready... Now, time to call the primeAddition() function with any argument... Here I pass 5 as an argument...
#Function call...

print primeAddition(5)

Я уверен, что полезно, но OP конкретно говорит: «Но я хочу знать ошибку в моем коде».

Tedinoz 27.12.2018 06:07

Потому что ваша логика неверна.

for y in range(2,half):
    res = x%y
    if res==0:
        sum = sum + x
        break

здесь вы проверяете факторы, и если есть фактор, то прибавляет к сумме, противоположной простым числам. Поэтому проверьте числа, в которых нет множителей (кроме 1).

from math import sqrt 

test = int(input())
for i in range(test):
    sum = 0
    max = int(input())
    if max==1:
        sum = 0
    elif max==2:
        sum += 2
    else:    
        sum = sum + 2
        for x in range(3,max+1):
            half = int(sqrt(x)) + 1
            if all(x%y!=0 for y in range(2,half)):
                sum = sum + x
   print(sum)     

Небольшая модификация того, что у вас есть:

from math import sqrt 
sum = 0
test = int(input())
max = int(input())


for x in range(test,max+1):
    if x == 1:
        pass
    else:
        half = int(sqrt(x)) + 1
        for y in range(2,half):
            res = x%y
            if res==0:
                break
        else:
            sum = sum + x

print(sum)    

Самая большая ошибка заключалась в том, что вы выполняли сумму = сумма + x перед перерывом, а не вне в операторе else.

PS: (хотя вы можете) я бы рекомендовал не использовать имена переменных, такие как max и sum, в вашем коде. Это специальные функции, которые теперь переопределены.

Это неправильно с переменной test, которая представляет собой количество раз, которое нужно прочитать в переменной max и запустить код. Т.е. вам не хватает внешнего цикла.

cdlane 27.12.2018 06:02

Я должен был уточнить. Это настройка, чтобы найти сумму простых чисел между тестом и макс.

HakunaMaData 28.12.2018 01:19
Ответ принят как подходящий

Это самая неработающая часть вашего кода, она делает противоположное тому, что вы хотите:

res = x%y
if res==0:
    sum = sum + x
    break

Вы увеличиваете sum только в том случае, если проходите весь цикл без прерывания. (И не используйте sum, поскольку вы переопределяете встроенный Python.) Это можно проверить, используя специальный случай else в цикле for, также известный как «без перерыва». Я внес это изменение ниже, а также исправил некоторые недостатки:

from math import sqrt

T = int(input())

for _ in range(T):
    N = int(input())

    sum_of_primes = 0

    if N < 2:
        pass
    elif N == 2:
        sum_of_primes = 2
    else:
        sum_of_primes = 2

        for number in range(3, N + 1, 2):

            for odd in range(3, int(sqrt(number)) + 1, 2):
                if (number % odd) == 0:
                    break
            else:  # no break
                sum_of_primes += number

    print(sum_of_primes)

ВЫВОД

> python3 test.py
3
5
10
10
17
23
100
>

Другие вопросы по теме