50


13

私はISBN番号のチェックディジットを計算するプログラムを書いています。 ユーザーの入力(ISBNの9桁)を整数変数に読み込み、最後の桁に2を掛け、2番目の最後の桁に3を掛けます。 これを行うにはどうすれば整数をその構成桁に「分割」できますか? これは基本的な宿題の練習なので、私はリストを使うべきではありません。

15 Answer


80


それから文字列を作成するだけです。

myinteger = 212345 number_string = str(myinteger)

それで十分です。 これで繰り返しできます。

number_stringのchの場合:print ch#は各桁を順番に印刷します。

それともスライスすることができます:

print number_string [:2]#最初の2桁print n_string [-3:]#最後の3桁print number_string [3]#4桁

'' '' '

あるいは、ユーザーの入力を整数に変換しないでください(ユーザーが文字列を入力します)。

列挙型のpos、chのisbn = raw_input()(反転(isbn)):print "%d *%dは%dです"%pos 2、int(ch)、int(ch)*(pos 2)

詳細については tutorialを読んでください。


66


while number:
    digit = number % 10

    # do whatever with digit

    # remove last digit from number (as integer)
    number //= 10

ループの各反復で、numberから最後の桁を削除し、 `+ digit +`に割り当てます。 それは逆で、最後の数字から始まり、最初の数字で終わります


20


list_of_ints = [str(ISBN)内のiに対するint(i)]

あなたに整数の順序付きリストを渡します。 もちろん、アヒルのタイプを考えれば、str(ISBN)でもうまくいくでしょう。

編集:コメントで述べたように、このリストは昇順または降順という意味でソートされていませんが、定義された順序を持っています(理論上のpythonのセット、辞書などはそうではありません)。かなり信頼できます)。 ソートしたい場合は、

list_of_ints.sort()

あなたの友だちです。 sort()はその場でソートし(のように、実際には既存のリストの順番を変えます)、新しいリストを返しません。


13


古いバージョンのPythonでは…​

map(int、str(123))

新バージョン3k

リスト(map(int、str(123)))


3


(数/ 10 ** x)%10

これはループ内で使用できます。ここで、numberは完全数、xはループの各繰り返し(0,1,2,3、…​、n)で、nが停止点です。 x = 0は1の位置、x = 1は10の位置、x = 2は数百の位置、というように続きます。 これは数字の値を右から左に与えるので、これはISBNには当てはまらないかもしれませんが、それでも各数字を分離します。


2


それを文字列に変換し、int()関数でそれをマッピングします。

map(int、str(1231231231))


2


再帰バージョン

def int_digits(n):n <10の場合[n]を返し、それ以外の場合int_digits(n / 10)[n%10]


2


`+ string`への変換は、10で割るよりも明らかに遅くなります。

`+ map +`はリストの理解よりも少し遅いです:

convert to string with map 2.13599181175
convert to string with list comprehension 1.92812991142
modulo, division, recursive 0.948769807816
modulo, division 0.699964046478

これらの時間は私のラップトップ上の以下のコードによって返されました:

foo = """\
def foo(limit):
    return sorted(set(map(sum, map(lambda x: map(int, list(str(x))), map(lambda x: x * 9, range(limit))))))

foo(%i)
"""

bar = """\
def bar(limit):
    return sorted(set([sum([int(i) for i in str(n)]) for n in [k *9 for k in range(limit)]]))

bar(%i)
"""

rac = """\
def digits(n):
    return [n] if n<10 else digits(n / 10)+[n %% 10]

def rabbit(limit):
    return sorted(set([sum(digits(n)) for n in [k *9 for k in range(limit)]]))

rabbit(%i)
"""

rab = """\
def sum_digits(number):
  result = 0
  while number:
    digit = number %% 10
    result += digit
    number /= 10
  return result

def rabbit(limit):
    return sorted(set([sum_digits(n) for n in [k *9 for k in range(limit)]]))

rabbit(%i)
"""


import timeit

print "convert to string with map", timeit.timeit(foo % 100, number=10000)
print "convert to string with list comprehension", timeit.timeit(bar % 100, number=10000)
print "modulo, division, recursive", timeit.timeit(rac % 100, number=10000)
print "modulo, division", timeit.timeit(rab % 100, number=10000)


1


このループの本体を使用して、数字でやりたいことをすべて実行します。

マップ内の数字(int、str(my_number)):


1


私はこのプログラムを作りました、そしてここに実際に私のプログラムのチェックデジットを計算するコードのビットがあります

#10桁の数字number = input( "ISBN numberを入力してください:")を取得

#no11 =(((int(number [0])* 11)(int(number [1])* 10)(int(number [2])* 9)(int(number [3])* 8) )
           + (int(number[4])*7) + (int(number[5])*6) + (int(number[6])*5) + (int(number[7])*4) +
(int(number [8])* 3)(int(number [9])* 2))/ 11)

#1に丸めますdp no11 = round(no11、1)

#no11 = str(no11).split( "。")の下の説明

#剰余を取得し、数字を確認する

#11桁のISBN印刷を計算します(「正しいISBN番号は」number str(no11))。

長いコード行ですが、数字を分割し、適切な量で桁数を掛け、それらを合計し、それらを11で割ると1行のコードになります。 .split()関数は(10進数で分割された)リストを作成するだけなので、リストの2番目の項目を取り出し、11からそれを取り出してチェックディジットを見つけることができます。 この2行を変更することで、これをさらに効率的にすることもできます。

residual = no11 [1] no11 =(11  -  int(剰余))

これに:

no11 =(11  -  int(no11 [1]))

お役に立てれば :)