Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Не получается заменить элемент строки

#python


N = int(input())
N = str(N)
kr3 = []
for i in range (len(N)):
    for j in range (1,10):
        N[i] = N[i].replace (N[i], str(j))
        if int(N) % 3 == 0:
            kr3.append (int(N))

print (max(N))


Формат входных данных
В первой строке записано натуральное число, не превышающее 10^100
.
Формат выходных данных
Выведите наибольшее число, кратное трём, отличающееся от исходного ровно одной цифрой.
Пример
стандартный поток ввода стандартный поток вывода
123 723

Выдает ошибку: str object does not support item assignment.
    


Ответы

Ответ 1



Основной посыл: число кратно трем, если сумма цифр в нем кратна трем. def find_max(value): data = list(value) for index in range(len(data)): if data[index] != '9': tmp = data[index] data[index] = str(9 - sum(map(int, data[:index] + data[index + 1:])) % 3) result = ''.join(data) if result > value: return result data[index] = tmp return value[:-1] + '6' print(find_max('123')) # 723 print(find_max('7000')) # 9000 print(find_max('1111')) # 9111 print(find_max('93556')) # 98556 print(find_max('1')) # 9 print(find_max('999')) # 996

Ответ 2



может, проще будет сделать так: b = '123' variants = [[int(b[:y]+str(x)+b[y+1:]) for x in range(int(b[y]),10)] for y in range(len(b))] res = max(set([(x if x%3==0 else 0) for y in variants for x in y])) print(res) 723 UPDATE Как было отмечено в комментарии,код выше неверно отрабатывается пограничные значения. Дополнил: b = '999' variants = [[int(b[:y]+str(x)+b[y+1:]) for x in range((int(b[y]) if b[y]!='9' else 1),10)] for y in range(len(b))] res = max(set([(x if x%3==0 else 0) for y in variants for x in y])-set([int(b)])) print(res) 996

Ответ 3



def max_multiple_of_three(number): remainder = int(number) % 3 #(1) need_to_three = (3 - remainder) #(2) for digit in number: new_digit = need_to_three + int(digit) #(3) multiplier = (9 - new_digit) // 3 #(4) new_digit += multiplier * 3 #(5) if digit != '9': return number.replace(digit, str(new_digit), 1) #(6) return number[:-1] + '6' Логика решения следующая: Чтобы выяснить, сколько числу не хватает до кратности трём, узнаём остаток от деления на 3 - выражение #(1) и вычитаем его из 3 - выражение #(2). Признак делимости на три - "Число делится на 3, если сумма всех его цифр делится на 3". Следовательно, мы можем сделать число кратным 3, прибавив нехватающее значение (полученное в предыдущем шаге) к любой цифре этого числа - #(3). А так как нам нужно максимальное число, то прибавлять мы должны к цифре с самым большим разрядом. Тут есть одна загвоздка: мы можем заменить цифру, сделав число кратным трём, но не получив при этом максимального числа. Например, имеем число 121. Ему до кратности трём не хвает 2. Прибавляем 2 к цифре 1 и получаем число 321. Но это число не является максимальным. Максимальным в этом случае будет 921. Для получения правильного результата, необходимо после выполнения шага №2, продолжать увеличивать целевую цифру на 3 до тех пор, пока эта цифра меньше или равна 9. Я сделал это, вычислив количество добавляемых 3 - #(4) и далее применив этот множитель - #(5). Как только подходящая цифра найдена, заменяем её в исходной строке и возвращем результат - #(6). Другой вариант решения. Суть таже, только вместо 3 используем 9. def max_multiple_of_three(number): remainder = int(number) % 9 for digit in number: new_digit = int(digit) + 9 - remainder if new_digit > 9: new_digit -= 3 elif new_digit < 7: new_digit += 3 if digit != '9': return number.replace(digit, str(new_digit), 1) return number[:-1] + '6' Тесты: print(max_multiple_of_three('0')) # 9 print(max_multiple_of_three('1')) # 9 print(max_multiple_of_three('9')) # 6 print(max_multiple_of_three('11')) # 81 print(max_multiple_of_three('20')) # 90 print(max_multiple_of_three('50')) # 90 print(max_multiple_of_three('123')) # 723 print(max_multiple_of_three('7000')) # 9000 print(max_multiple_of_three('1111')) # 9111 print(max_multiple_of_three('93556')) # 98556 print(max_multiple_of_three('999')) # 996

Комментариев нет:

Отправить комментарий