Сбой в коде Python при преобразовании из кода C ++?

0

Я немного новичок в python, и мне интересно, как вы преобразовали следующий код в C++ в python

int kids, cd;
while (cin >> kids >> cd){
    if (kids == 0 && cd == 0)
    break;
    cout << pow(cd, kids)<<endl;
}

Поэтому я думаю, что это возможно что-то вроде

    from math import pow
    kids = int(raw_input())
    cd = int(raw_input())
    while kids!=0 and cd!=0:
       print pow(cd, kids)
       kids = int(raw_input())
       cd = int(raw_input())

Когда я отправляю свой код на Python онлайн-судье SPOJ, я получил ошибку времени выполнения. Мой C++ код не принят из-за переполнения, когда числа становятся слишком большими... Что не так?

Также, когда я попытался скомпилировать код python, используя

http://repl.it/languages/Python

с вводом

2
5

и я получаю вывод

25.0

Но как я могу сделать это 25 вместо 25.0?

Благодарю!

  • 0
    Вы имели в виду >> или это должно быть >= ?
  • 0
    @Hugh: Хью: >> вероятно, намеренный; cin >> x читает из стандартного ввода в x .
Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ

Ваш код Python близок, но не совсем как оригинальный C++ код. В C++ вы выходите из цикла на EOF или когда оба числа равны 0. В Python вы выходите только тогда, когда оба числа равны нулю, в противном случае с ошибкой во время выполнения EOF. Кроме того, в C++, cin >> kids >> cd будет читать kids и cd со стандартного ввода, разделенного пробелами, тогда как ваш код Python читает его разделенным символом новой строки. Наконец, вы используете целые операции в C++, но вычисления с плавающей запятой в Python.

Начнем с проблемы EOF. Чтобы поймать EOF, вы читаете как обычно и перехватываете исключение EOFError, например:

try:
    kids = int(raw_input())
    cd   = int(raw_input())
except EOFError:
    break  # out of the loop we're in (not shown)

Проблему с плавающей запятой также довольно легко решить: pow не требуется; скорее, Python получил для этого оператора: **. Таким образом, у вас есть

print cd ** kids

И, наконец, существует такая неприятная проблема с разделителями. Как вы решаете это, зависит от того, как выглядит ваш вход. Если у вас есть два входа на линию, например:

1 2
3 4
5 6

Затем вы хотите прочитать строку один раз, разделить ее и преобразовать каждую часть в целое число:

try:
    line = raw_input()
except EOFError:
    break
kids, cd = line.split()
kids = int(kids)
cd   = int(cd)

Существуют и другие решения для других форматов, включая прямую параллель с кодом C++; но это более сложно и может не понадобиться.

Наконец, рассмотрите возможность использования while True loop, не повторяя kids =...; cd =... kids =...; cd =... в начале и break когда вы хотите остановиться, как и в коде C++.

1
while True:
    kids = int(raw_input())
    cd   = int(raw_input())
    if cd and kids:
        print(cd ** kids)
    else:
        break

Редактировать после просмотра http://www.spoj.com/problems/UJ/ Я бы предложил

while True:
    n,d = [int(s) for s in raw_input().split()]
    if n and d:
        print(n ** d)
    else:
        break
  • 0
    Спасибо, Хью Ботвелл. Но ваш код все еще выдает ошибку во время выполнения по некоторым причинам, когда я отправил его на онлайн-судью SPOJ.
  • 0
    Вот подробности: <br> номер состояния сигнала времени тест памяти 0 ошибка времени выполнения -1 0,03 с 3740 КБ </br>
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню