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

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

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2020, 18:27   #11
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Дано натуральное число N. Проверить, является ли оно степенью числа 2, и если да, то найти эту степень..
Формат входных данных
Натуральное число N (1 <= N <= 109).
Формат выходных данных
Если число N является степенью числа 2, то вывести эту степень. Если же число N не является степенью числа 2, то вывести число -1.

Это тоже выполнил, скажите как упростить (Если вообще можно).
Код:
n = int(input())
count = 0
num = 1
while n > num or n == num:
    num = num * 2
    count += 1
if n == num/2:
    print(count-1)
else:
    print('-1')
FsGaCh вне форума Ответить с цитированием
Старый 10.05.2020, 18:30   #12
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Найти наибольший общий делитель (НОД) и наименьшее общее кратное (НОК) двух заданных натуральных чисел.
Формат входных данных
Два натуральных числа N, M (1 <= N, M <= 109).
Формат выходных данных
В одной строке НОД и НОК, разделенные одним пробелом.

Смог выполнить лишь НОД, НОК не смог:
Код:
n = input()
n = n.split()
n1 = int(n[0])
n2 = int(n[1])
ss1 = []
ss2 = []
AKOB = 0
ABOB = 0
el1 = 0
el2 = 0
index1 = 0
index2 = 0
for i in range(1, n1+1):
    if n1 % i == 0:
        ss1.append(i)
for i in range(1, n2+1):
    if n2 % i == 0:
        ss2.append(i)
for i in range(len(ss1)):
    for k in range(len(ss2)):
        if int(ss1[i]) == int(ss2[k]):
            index1 = i
            index2 = k
            ABOB = int(ss1[index1])
print(ABOB)
FsGaCh вне форума Ответить с цитированием
Старый 10.05.2020, 19:22   #13
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

По поводу поиска всех делителей. Самое простое правило для оценки получившейся программы это запустить ее с самыми "плохими" входными данными (например, с N = 1000000000) и оценить размер потребляемой памяти и затраченное время на выполнение. Обычно печать за один раз лучше, чем печать по одному числу, но если данных много, то можно потратить слишком много памяти на ее временное хранение. В питоне можно "отменить" печать новой строки print(n, end = '') и таким образом печатать несколько раз в одну строку. Следующее замечание - число, большее "n / 2", не может быть делителем (кроме самого n). Обычно же рассматривают числа только до корня из n. Поскольку в условии не требуют вывести делители по возрастанию, то можно сделать так:
Код:
from math import (
    ceil,
    sqrt
)

n = int(input())
print(1, end = '')
t = ceil(sqrt(n))
for i in range(2, t):
    if n % i == 0:
        print(" %d %d" % (i, n / i), end = '')
if n > 1:
    print(" %d" % n, end = '')
    if t * t == n:
       print(" %d" % t, end = '')
Про степени двойки. В принципе, тут что не делай, для таких маленьких чисел легко уложиться в ограничения. Ну можно уменьшить длину кода, например:
Код:
n = int(input())
count = 0
while 2 ** count < n:
    count += 1
if 2 ** count == n:
    print(count)
else:
    print(-1)
Про НОД и НОК. Лучше запомнить реализацию алгоритма Евклида, чем перебирать все делители. А НОК равен (M * N) / НОД.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.05.2020 в 20:01.
BDA на форуме Ответить с цитированием
Старый 16.05.2020, 15:46   #14
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Я захотел написать программу для нахождения n-ого числа фибоначчи. Не смог. И тогда я поискал на других сайтах, но, не один из тех вариантов которые я нашёл не сработал. Все варианты выдавали тот же-неправильный ответ.
Мой вариант:

Код:
a = 1
b = 1
n = int(input())
if n > 2:
    for i in range(n-2):
        c = a + b
        a = b + c
        b = c + a
print(b)
FsGaCh вне форума Ответить с цитированием
Старый 16.05.2020, 16:35   #15
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
a = 1
b = 1
n = int(input())
if n > 2:
    for i in range(n - 2):
        c = a + b
        a = b
        b = c
print(b)
Вроде верный ответ.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 16.05.2020, 16:51   #16
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
a = 1
b = 1
n = int(input())
if n > 2:
    for i in range(n - 2):
        c = a + b
        a = b
        b = c
print(b)
Вроде верный ответ.
Я это пробую с входным данным 10, выводит 2. Но десятое число фибоначчи это не 2. Или я что-то упустил или в python-е ошибка.
FsGaCh вне форума Ответить с цитированием
Старый 16.05.2020, 17:24   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

https://ideone.com/NrFpkC
У меня для входных 10 печатает 55 на 2 и 3 питонах.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 16.05.2020, 19:24   #18
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Цитата:
Дано натуральное число N. Проверить, является ли оно степенью числа 2, и если да, то найти эту степень..
Формат входных данных
Натуральное число N (1 <= N <= 109).
Цитата:
Это тоже выполнил, скажите как упростить (Если вообще можно).
Максимальное вводимое число помещается в байт.
Альтернативное решение:
Код:
n = int(input('Введите число целого типа: '))
flg = False
m = 0
while n:
    if n & 1:            # мл. бит 1
        if(n >> 1) == 0: # старшие биты 0
            flg = True  
            break
        else:            # старшие биты != 0
            flg = False
            break
    n = n >> 1           # сдвиг вправо
    m += 1
if flg:
    print(' == ', m)
PS: Сдвиги делаются быстрее.
При условии, что введенное число соответствует условию задачи, будет сделано 7 проверок (максимально).
Но работает и на больших числах.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 16.05.2020, 19:29   #19
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

ViktorR, там по условию, скорее всего, 10^9, просто форум скушал верхний регистр.
Ещё можно сначала проверить n & (n - 1) == 0, тогда n является степенью двойки (и другие полезные фокусы https://graphics.stanford.edu/~seander/bithacks.html).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 16.05.2020 в 19:43.
BDA на форуме Ответить с цитированием
Старый 17.05.2020, 17:13   #20
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Ешё одна задачка которую я не понимаю как решить:


Разложить натуральное число N на простые делители.

Формат входных данных:
Натуральное число N (1 < N <= 10000).

Формат выходных данных:
В одной строке через один пробел вывести в порядке не убывания все простые делители числа N.

Я не понимаю как это сделать, и своего варианта у меня нету.
FsGaCh вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
готовлюсь к олимпиаде по информатике salauat Паскаль, Turbo Pascal, PascalABC.NET 25 01.12.2013 21:32
Подготовиться к олимпиаде за лето UaKot Свободное общение 20 10.05.2013 18:53
Подготовка к региональной олимпиаде New man Помощь студентам 20 14.12.2012 21:01
Задачи по олимпиаде Darick Помощь студентам 7 23.12.2011 15:45
Как подготовиться к олимпиаде? Kn793 Помощь студентам 16 26.07.2008 12:22