2014-01-31 3 views
0

Я вроде новичок в Python, и мне интересно, как бы вы преобразовать следующий код в C++ для питонаОшибка в коде python при преобразовании из кода на C++?

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++ не принят из-за переполнения, когда числа становятся слишком большими ... Что случилось?

Кроме того, когда я пытался скомпилировать код питона с помощью

http://repl.it/languages/Python

с входом

2 
5 

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

25.0 

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

Спасибо!

+0

Вы имели в виду '>>' или должны быть '> ='? –

+0

@Hugh: '>>', вероятно, намеренно; 'cin >> x' считывает со стандартного ввода в' x'. – icktoofay

+0

Да, >> намеренно; на каждой строке будут две переменные: дети и компакт-диск будут прочитаны в – user3213711

ответ

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 цикл без повторения 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. – user3213711

+0

Вот подробности:
номер \t \t статуса сигнала \t \t Времени памяти тест 0 \t Ошибки выполнения \t -1 \t \t 0.03s 3740KB
user3213711

+0

@ user3213711: какой SPOJ проблем? –

Смежные вопросы