Я новичок в программировании. Пытаясь решить эту проблему, я получаю неправильный ответ. Я проверял свой код несколько раз, но не смог определить ошибку. Пожалуйста, помогите мне с этой простой проблемой. Проблема в следующем:
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 соответственно. Пожалуйста, выясните ошибку в моем коде.
Спасибо, @AndersonGreen. Но я хочу знать ошибку в моем коде.
См. Эту реализацию сито






Прежде всего, объявите сумму равной нулю в начале цикла 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.
Здесь я реализовал простую программу, чтобы найти сумму всех простых чисел от 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 конкретно говорит: «Но я хочу знать ошибку в моем коде».
Потому что ваша логика неверна.
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 и запустить код. Т.е. вам не хватает внешнего цикла.
Я должен был уточнить. Это настройка, чтобы найти сумму простых чисел между тестом и макс.
Это самая неработающая часть вашего кода, она делает противоположное тому, что вы хотите:
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
>
Возможный дубликат Как найти сумму простых чисел в заданном диапазоне в Python 3.5?