Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2022, 13:47   #1
fyz abkbvjyjdf
 
Регистрация: 04.12.2022
Сообщений: 8
Подмигивание Программирование на Python

Помогите, пожалуйста, написать программу максимально простым языком, без встроенных функций
Дан массив натуральных чисел А(N), значения элементов которого
лежат в диапазоне [1500,2500]. Найти: а) сумму элементов массива, цифровая
запись которых дает нечетную сумму цифр б) максимальный элемент среди
тех, которые являются простыми.
fyz abkbvjyjdf вне форума Ответить с цитированием
Старый 11.12.2022, 16:42   #2
Артём812
Пользователь
 
Регистрация: 12.10.2016
Сообщений: 12
По умолчанию

Добрый день!
Может можно и проще... Вариант:
Код:
#a
import re


def odd_summ(x, y=2500):
	pattern = r'\d{1}'
	r = re.compile(pattern)
	tmp = list(map(int, re.findall(pattern, str(x))))
	while sum(tmp) % 2 == 0:
		x += 1
		tmp = list(map(int, re.findall(pattern, str(x))))
	return ''.join(map(str,tmp))


#b
def eratosfen(x, y=1500):
    a = [True] * x
    a[0] = a[1] = False
    for n in range(2,x):
        if a[n]:
            for i in range(2 * n, x, n):
                a[i] = False
    return max([j for j, k in enumerate(a) if k and i in range(y, x + 1)])
Артём812 вне форума Ответить с цитированием
Старый 11.12.2022, 18:37   #3
fyz abkbvjyjdf
 
Регистрация: 04.12.2022
Сообщений: 8
По умолчанию Программирование на Python

Дан массив в диапазоне. Как найти максимальный элемент среди тех, которые являются простыми.
Но написать это все базовым языком?
fyz abkbvjyjdf вне форума Ответить с цитированием
Старый 11.12.2022, 19:22   #4
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 961
По умолчанию

задаётся начальный максимальный например 0
формируется массив и далее цикл

элемент массива проверяется простой ли

если простой сравнивается с максимальным
и если элемент массива больше максимума тогда максимальный равен элементу массива

проверив все элементы массива выясняется максимальный
причём возможно печатать найденные простые чтобы контролировать

простые на питон python есть здесь:
https://www.programmersforum.ru/show...&postcount=104
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Старый 12.12.2022, 09:56   #5
Артём812
Пользователь
 
Регистрация: 12.10.2016
Сообщений: 12
По умолчанию

Еще вариант:
Код:
def max_simple(l, u)->int:
    i = u
    while i > (l + u) // 2:
        if is_simple(i):
            return i 
        i -=1
    return 0


def is_simple(x)->bool:
    """
        проверяет, является ли число x простым
    """
    divisor = 2
    while divisor < x:
        if x % divisor == 0:
            return False
        divisor += 1
    return True
Артём812 вне форума Ответить с цитированием
Старый 13.12.2022, 12:17   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,311
По умолчанию

Совсем без встроенных функций не получится, но, как вариант:
Код:
from random import randint

def odd_sum(x):
    s = 0                 # Сумма цифр
    m = x
    while m != 0:
        d = m % 10        # Получим младшую цифру
        m = m // 10       # Удалим младшую цифру
        s += d            # Искомая сумма
    return True if s % 2 else False  # True для нечётной суммы

def is_simple(x):
    m = int(x**0.5) + 1      # Достаточно проверять только до корня квадратного
    for d in range(2, m):    # Возможные делители
        if x % d == 0:       # Есть делитель
            f = False
            break
    else:                    # Делителей нет - Простое
        f = True             # Для простого возвращаем True
    return f

N = 10                       # Сколько
a = 1500                     # От
b = 2500                     # До

m = [randint(a, b) for i in range(N)]  # Готовим список целых чисел в заданном диапазоне
print(m)                               # Для контроля

summa = 0
simpl_max = 0
not_simple = True            # Предположим, что простое есть в списке
for i in range(len(m)):      # Ищем первое простое
    if is_simple(m[i]):
        simpl_max = m[i]     # Нашли
        break
else:
    not_simple = False       # В списке нет простых чисел
    
for i in range(len(m)):
    if odd_sum(m[i]) % 2:    # Нечётная сумма цифр
        summa += m[i]
    # В списке есть простые числа и текущее число простое и текущее число больше
    if not_simple and is_simple(m[i]) and m[i] > simpl_max:
        simpl_max = m[i]
print(summa, simpl_max)
Результат работы:
[2450, 2125, 2444, 2002, 2369, 1816, 2092, 1500, 1915, 2377]
6919 2377

PS: Кода может быть и многовато, но некоторые правила соблюдены.
Например:
сфинкс
Цитата:
задаётся начальный максимальный например 0
Так делать нельзя. В последовательности может не быть простых чисел. Тогда простым окажется 0 или иное число, которого нет в исходной последовательности.
Необходимо за начальное значение, при поиске максимального, минимального или ..., брать число из последовательности.

Артём812
Код:
divisor = 2
    while divisor < x:
        if x % divisor == 0:
            return False
        divisor += 1
    return True
Перебирать делители числа достаточно только до квадратного корня из числа.
Почему? Подумайте.

Некоторую часть кода можно упростить, например функция для поиска суммы цифр
Код:
def odd_sum(x):
    s = 0                 # Сумма цифр
    m = str(x)
    for i in m:
        s += int(i)
    return True if s % 2 else False  # True для нечётной суммы
Но встроенные функции
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 13.12.2022, 12:35   #7
Артём812
Пользователь
 
Регистрация: 12.10.2016
Сообщений: 12
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Перебирать делители числа достаточно только до квадратного корня из числа
Спасибо!

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Почему? Подумайте
Потому что если число не простое, то оно имеет как минимум 2 множителя, хотя бы один из которых будет меньше или равно квадратному корню из числа. Т. о. перебирать значения больше квадратного корня из числа не имеет смысла.
Поправьте, пожалуйста, если что упустил. Спасибо!
Артём812 вне форума Ответить с цитированием
Старый 13.12.2022, 18:21   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Перебирать делители числа достаточно только до квадратного корня из числа.
Или когда квадрат divisor станет больше чем x. Тогда не придется считать квадратный корень.
macomics вне форума Ответить с цитированием
Старый 14.12.2022, 11:18   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,311
По умолчанию

macomics
Цитата:
Или когда квадрат divisor станет больше чем x. Тогда не придется считать квадратный корень.
Не годится. Корень считаем один раз для числа, а квадрат - для каждого возможного делителя.
Для достаточно большого простого числа такой перебор затянется.

Подход с квадратом хорош, например, для контроля расстояния - "попадает ли точка в круг радиуса R".
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 14.12.2022, 15:49   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Не годится. Корень считаем один раз для числа, а квадрат - для каждого возможного делителя.
Для достаточно большого простого числа такой перебор затянется.

Подход с квадратом хорош, например, для контроля расстояния - "попадает ли точка в круг радиуса R".
Зато избавляемся от еще одной встроенной функции (sqrt).
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование на python Семен_13 Python 7 17.10.2022 17:59
Верно ли, что учить программирование лучше начинать с языка Python? Ян1327 Общие вопросы по программированию, компьютерный форум 20 11.09.2019 12:16
Программирование Python Белка и Стрелка Помощь студентам 1 29.05.2017 23:53
Python на другой язык программирование KingRing Фриланс 10 24.11.2016 12:09