0

ユークリッド アルゴリズムを使用して、与えられた 2 つの整数の最大公約数 (GCD) を計算するプログラムを作成しています。入力には、空白で区切られた 2 つの正の整数 x と y が含まれます。0 0 が入力されると、プログラムは終了します。私はPythonを始めたばかりで、間違いなくプログラミングの初心者なので、コーディングの練習は少し荒いかもしれません. 計算された GCD を入力と同じ行に出力しようとしています。その計算された値を、2 つの整数を入力したのと同じ行に出力するにはどうすればよいですか?

入力が完了すると、次のようになります。

入力:

210 45 15

これが私ができるすべてです:

入力:

210 45

15

これまでのところ、Python 2.7 用のこのコードがあります。

def gcd (x, y):              # Greatest Common Divisor function
    if x > y:
        r = x%y                  # r = x divided by y and gives the remainder
        if r == 0:                  # if the division of x and y has no remainder, return y because y is the gcd.
            return y                #This is true because no number may have a divisor greater than the number itself (non-negative).  
        else:
            return gcd(y, r)            #if a = bt+r, for integers t and r, then gcd(x,y) = gcd(b,r)
    if x < y:
        x, y = y, x                 # value swapping
        return gcd(x, y)


getinput = True         
while(getinput):
                                     #list created for storing user entered values
    ssplit = []
    s = raw_input('Input: \n ')        # read a string of data, no evaluation by python
    ssplit = s.split(' ')           # read values between whitespace
    x = int(ssplit[0])          # place value from raw_input() into list
    y = int(ssplit[1])

    if( x != 0 and y != 0 ):        #tests to see if gcd needs to be evaluated
        print (gcd (x, y))
    else:
        getinput = False        # input was 0 0
4

1 に答える 1

0

呪われずに逃げたいなら、これが役立つかもしれません。各入力後に画面を消去しますが、古い出力を記憶して再描画します。

import functools
import platform
import subprocess
import sys

def use_full_screen(question=None, history=None):
    if platform == 'win32':
        cls_cmd = 'cls'
    else:
        cls_cmd = 'clear'
    subprocess.call(cls_cmd)
    if history:
        print history
    if question is not None:
        return raw_input(question)


def make_screen(question, func, input_converter, max_repeat=9999):
    question += ': '
    def make_history(question, args, res):
        history = question[:-1]
        for arg in args:
            history += ' {}'.format(arg)
        history += ' {}'.format(res)
        return history

    def modfiy_input_converter(input_converter):

        @functools.wraps(input_converter)
        def converter(input_string):
            if input_string.strip() in ['exit', 'quit']:
                sys.exit(0)
            try:
                args = input_converter(input_string)
            except ValueError as err:
                msg = err.message
                msg += '\nInvalid input contine y/n: '
                cont = use_full_screen(msg,  history)
                if cont.strip() and cont in ['y', 'Y', 'yes', 'Yes']:
                    return converter(use_full_screen(question, history))
                sys.exit(0)
            return args
        return converter

    input_converter = modfiy_input_converter(input_converter)
    history = None
    args = input_converter(use_full_screen(question))
    res = func(*args)
    history = make_history(question, args, res)
    args = input_converter(use_full_screen(question, history))
    for _ in xrange(max_repeat):
        res = func(*args)
        history +='\n' + make_history(question, args, res)
        args = input_converter(use_full_screen(question, history))
    use_full_screen(history=history)

これはあなたの機能です:

def gcd (x, y):
    """Greatest Common Divisor function"""
    if x > y:
         # r = x divided by y and gives the remainder
        r = x % y
        if r == 0:
            # if the division of x and y has no remainder, return y
            # because y is the gcd.
            # This is true because no number may have a divisor greater than
            # the number itself (non-negative).
            return y
        else:
             #if a = bt+r, for integers t and r, then gcd(x,y) = gcd(b,r)
            return gcd(y, r)
    elif x < y:
         # value swapping
        x, y = y, x
        return gcd(x, y)
    else:
        return x

入力を変換する関数を書く必要があります:

def input_converter_gcd(input_string):
    try:
        values = tuple(int(x) for x in input_string.split())
    except ValueError:
        raise ValueError("Please enter integer numbers.")
    if len(values) != 2:
        raise ValueError(
            "Exactly 2 items needed but {:d} entered.".format(len(values)))
    return values

ValueError話すメッセージで a を上げます。このメッセージはユーザーに表示されます。

最後にプログラムを開始します。

question = 'Enter two numbers'
make_screen(question, gcd, input_converter_gcd, max_repeat=10)
于 2013-06-05T13:12:04.953 に答える