Программа которая проверяет делится ли целое число на 3

Мне нужно создать рекурсивную функцию, которая вернет мне true, если входной номер делится на 3. Я знаю, что это проще простого без рекурсии, но мне нужно создать функцию этого типа. Я создал функцию, но я хочу знать, возможно ли создать лучший вариант, потому что с большим числом «num» функция не работает. Я думаю, что я должен использовать этот факт: натуральное число делится на 3, если сумма его цифр делится на 3. Это мой код:

def divThree(num):
if num==3:
return true
else:
divThree(num-3)

EDIT: я создал лучшую функцию, но я не понимаю, почему не возвращает меня true, если число делится на три. Вместо этого, если это не так, происходит ошибка максимальной рекурсии.

def recursiveThree(num):
if num==3 or num==6 or num==9:
return true
else:
sum=0
sNum=str(num)
for i in range(0,len(sNum)):
sum=sum+int(sNum[i])
recursiveThree(sum)
спросил(а) 2020-02-26T16:20:19+03:00 3 года, 4 месяца назад
добавить комментарий
пожаловаться

    Самое простое решение — использовать modulo 3 для проверки делимости, но это не будет рекурсивным. Альтернативное решение состоит в том, чтобы рекурсивно продолжать делить на 3, пока вы не спуститесь до 1, но это приведет к переполнению стека для больших значений. Третье решение, которое поддается рекурсии, заключается в том, чтобы использовать свойство, которое, если сумма цифр числа делится на 3, то число делится на 3.

def divThree(num):

Информатика ЕГЭ Задача 25. Делители


if num < 10:
return (num in [3, 6, 9])
else:
return divThree(sum([int(digit) for digit in str(num)]))

Вы можете добавить 0 к списку в первом return если хотите считать его делимым на 3. Если вы хотите разместить как положительные, так и отрицательные значения, добавьте:

if num < 0:
return divThree(-num)
как первая проверка.
ответил(а) 2020-02-26T16:33:27.226205+03:00 3 года, 4 месяца назад
добавить комментарий
пожаловаться

Вам нужно проверить, имеет ли число нулевой остаток при использовании 3 в качестве делителя. Используйте оператор % для проверки остатка. Поэтому, если вы хотите увидеть, если что-то равномерно делится на 3, то используйте num % 3 == 0 Если остаток равен нулю, то число делится на 3. Это возвращает true:

Читайте также:
Как правильно пишется эксель на английском программа

print (6 % 3 == 0)
returns True
Это возвращает False:
print (5 % 3 == 0)
returns False
Вот простая функция для проверки True of False:
def divThree(numb):
return numb % 3 == 0

print (divThree(99))

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

def divThree(numb):
return numb % 3 == 0

print (divThree(4325609549876542987503216540321540104986213754901245217346214390735402153407213540213457183254098263487053214132754073254921534987053245321454))

Returned True
ответил(а) 2020-03-19T16:36:31.247790+03:00 3 года, 3 месяца назад
добавить комментарий
пожаловаться
Вы выберете рекурсивно коэффициент для вычитания:
def divisible_by_tree(num, factor=3):

Простое число (while)


if factor < num:
num = divi(num, factor * 2)
if num >= factor:
num -= factor
if factor > 3:
return num
return num == 0
ответил(а) 2020-02-26T16:20:19+03:00 3 года, 4 месяца назад
добавить комментарий
пожаловаться

Вы могли бы выяснить, что потребуется, чтобы число стало делимым на 3, используя modulo, а затем вычитая, что для num

def divThree(num):
if num % 3 == 0:
return True
a = num % 3
return divThree(num-a)
ответил(а) 2020-02-26T16:20:19+03:00 3 года, 4 месяца назад
добавить комментарий
пожаловаться

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

from random import randint # For test trials

def isDivisByThree(n):
sN = str(n)
if(len(sN) == 1):
bIsProductOfThree=True if(n==3 or n==6 or n==9) else False
return bIsProductOfThree
else:
sumOfDigits = 0
for x in sN:
sumOfDigits += int(x)
# end for
return isDivisByThree(sumOfDigits)
# end if
# end isDivisByThree(. )

def main():
for testTrialCount in range(1, 35+1):
testSubject = randint(1, 2147483647)
result = isDivisByThree(testSubject)
if(result):
print(«Test Trial #» + str(testTrialCount) + «: » + str(testSubject) + » is divisble by 3!»)
else:
print(«Test Trial #» + str(testTrialCount) + «: » + str(testSubject) + » is NOT divisble by 3.»)
# end if
# end for
# end main()

main()

Это работает из-за теоремы, связанной с применением конгруэнций, которая гласит: если d|(b-1) то n = (a_k *. * a_1 * a_0) делится на d тогда и только тогда, когда сумма цифр a_k +. + a_1 + a_0 делится на d. (Где d — делитель (3 для этого примера), а b — база, в которой число выражено (10 для этого примера).) Пример вывода для первых 10 испытаний:

Читайте также:
Как разделить диск в программе acronis disk director

Test Trial #1: 458327921 is NOT divisble by 3.
Test Trial #2: 23787660 is divisble by 3!
Test Trial #3: 820562190 is divisble by 3!
Test Trial #4: 1466915534 is NOT divisble by 3.
Test Trial #5: 1395854683 is NOT divisble by 3.
Test Trial #6: 1844052852 is divisble by 3!
Test Trial #7: 261731131 is NOT divisble by 3.
Test Trial #8: 624183104 is NOT divisble by 3.
Test Trial #9: 788686237 is NOT divisble by 3.
Test Trial #10: 1075010016 is divisble by 3!
.

Источник: progi.pro

Составьте программу, которая проверяет, делится ли на 3 введенные целое число, и выводит на экран соответствующее сообщение:

program abc;
var a: integer;
begin
readln(a);
if a mod 3 = 0 then writeln(‘Делится’)
else writeln(‘Не делится’);
end.

Код написан на языке Паскаль. Считываем число и записываем его в переменную a. Проверяем делится ли оно без остатка на 3 (т. е. кратно ли оно 3-м). Если кратно, то выводим «Делится». Если нет, то выводим «Не делится».

Как добавить хороший ответ?
Что необходимо делать:

  • Написать правильный и достоверный ответ;
  • Отвечать подробно и ясно, чтобы ответ принес наибольшую пользу;
  • Писать грамотно, поскольку ответы без грамматических, орфографических и пунктуационных ошибок лучше воспринимаются.

Что делать не стоит:

  • Списывать или копировать что-либо. Высоко ценятся ваши личные, уникальные ответы;
  • Писать не по сути. «Я не знаю». «Думай сам». «Это же так просто» — подобные выражения не приносят пользы;
  • Писать ответ ПРОПИСНЫМИ БУКВАМИ;
  • Материться. Это невежливо и неэтично по отношению к другим пользователям.

Пример вопроса
Русский язык
7 минут назад
Какой синоним к слову «Мореплаватель»?
Пожаловаться

Хороший ответ
Вася Иванов

Мореплаватель — имя существительное, употребляется в мужском роде. К нему может быть несколько синонимов.
1. Моряк. Старый моряк смотрел вдаль, думая о предстоящем опасном путешествии;
2. Аргонавт. На аргонавте были старые потертые штаны, а его рубашка пропиталась запахом моря и соли;
3. Мореход. Опытный мореход знал, что на этом месте погибло уже много кораблей, ведь под водой скрывались острые скалы;
4. Морской волк. Старый морской волк был рад, ведь ему предстояло отчалить в долгое плавание.

Читайте также:
Установить программу очистки кэша

Источник: uchi.ru

Проверьте, является ли число делимым на 3

Введите код, чтобы определить, делится ли число на 3. Вход в функцию представляет собой бит одиночный, 0 или 1, а выход должен быть 1, если число, полученное до сих пор, является двоичное представление числа, делящегося на 3, в противном случае — 0.

input «0»: (0) output 1 inputs «1,0,0»: (4) output 0 inputs «1,1,0,0»: (6) output 1

Это основано на вопросе интервью. Я прошу рисовать логические ворота, но поскольку это stackoverflow, я соглашусь с любым языком кодирования. Бонусные баллы за аппаратную реализацию (verilog и т.д.).

Часть a (легко):. Первый вход — это MSB.

Часть b (немного сложнее): Первый ввод — это LSB.

Часть c (трудная): Какая из них быстрее и меньше, (a) или (b)? (Не теоретически в смысле Big-O, но практически быстрее/меньше.) Теперь возьмите более медленный/больший и сделайте его быстрым/маленьким, чем более быстрый/меньший.

ОТВЕТЫ

Ответ 1

Таблица состояний для LSB:

S I S’ O 0 0 0 1 0 1 1 0 1 0 2 0 1 1 0 1 2 0 1 0 2 1 2 0

Таблица состояний для MSB:

S I S’ O 0 0 0 1 0 1 2 0 1 0 1 0 1 1 0 1 2 0 2 0 2 1 1 0

Объяснение: 0 делится на три. 0 >> 1 + 0 = 0 . Повторяйте с помощью S = (S >> 1 + I) % 3 и O = 1 , если S == 0 .

S’ отличается от предыдущего, но O работает одинаково, поскольку S’ равно 0 для тех же случаев (00 и 11). Поскольку O одинаково в обоих случаях, O_LSB = O_MSB, поэтому, чтобы сделать MSB коротким, как LSB, или наоборот, просто используйте кратчайший из них.

Ответ 2

Существует довольно известный трюк для определения того, является ли число кратным 11, путем поочередного добавления и вычитания его десятичных цифр. Если число, которое вы получаете в конце, кратно 11, то число, с которого вы начали, также кратно 11:

47278 4 — 7 + 2 — 7 + 8 = 0, multiple of 11 (47278 = 11 * 4298) 52214 5 — 2 + 2 — 1 + 4 = 8, not multiple of 11 (52214 = 11 * 4746 + 8)

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru