LoginSignup
2
2

More than 5 years have passed since last update.

プログラマの考えが・・身につく本より:ルーンチェックサムの検証(固定長)

Last updated at Posted at 2016-04-16

Pythonでプログラミング入門中
前回より引き続き

また今回はその前に問題提示されている
・数値を最後まで読み終えたことを知る
これを解決するため問題に挑戦します。

ルーンチェックサムの検証(固定長)

6桁の識別番号(チェックディジットを含むもの)を受け取り、その値がルーン式で妥当かどうかを調べるプログラムを書こう。このプログラムでは、1つの桁を読み込んだら次の桁に進む前に、その桁の処理をすませなければいけない。

ただ、いつものことながらこのままではむずかしいので

○単純なチェックサムの検証(固定長)

6桁の識別番号(チェックディジットを含むもの)を受け取り、その値がルーン式で妥当かどうかを調べるプログラムを書こう。各桁の数値を足した結果が10で割り切れれば、その値が妥当であると見なす。このプログラムでは、1つの桁を読み込んだら次の桁に進む前に、その桁の処理を済ませなければいけない。

char digit;
int checksum = 0;
cout << "Enter a six-digit number:";
for (int position = 1; position <= 6; position ++) {
    cin >> digit;
    checksum += digit - '0';
}
cout << "Checksum is " << checksum << ". \n";
if (checksum % 10 == 0) {
    cout << "Checksum is divisible by 10. Valid. \n";
} else {
    cout << "Checksum is not divisible by 10. Invalid. \n";
}

自分の解答(Python)

ConsoleOut.py
#!/usr/bin/env python
#coding:utf-8

#shiracamusさんに教えていただいたpythonでのcoutを利用
from ConsoleOut import cout


def number():
    checksum = 0
    for i in range(6):
        cout << "Enter a six-digit number:"
        digit = input()
        checksum += int(digit)
    cout << "Checksum is " + str(checksum) + ". \n";
    if checksum % 10 == 0:
        cout << "Checksum is divisible by 10. Valid .\n"
    else:
        cout << "Checksum is not divisible by 10. Invalid. \n"

test01.py(6桁入力数字を足し合わせる)
### こっから自作と言えるほどでもないですが書きました。
#!/usr/bin/env python
#coding:utf-8

from ConsoleOut import cout


def number():
    checksum = 0
    for i in range(6):
        cout << "Enter a six-digit number:"
        digit = input()
        checksum += int(digit)
    cout << "Checksum is " + str(checksum) + ". \n";
    if checksum % 10 == 0:
        cout << "Checksum is divisible by 10. Valid .\n"
    else:
        cout << "Checksum is not divisible by 10. Invalid. \n"

いままでの流用で書いている部分がほとんどですが、
int型とstr型や内部変数などの理解がまだ不十分で最初 checksum += int(digit) の
部分でなぜか、足しあわせてくれないな〜と悩んでいましたところ。
checksum = 0で宣言?しておけば合計してくれました。
とりあえずできたかな(汗

(追記)同時に奇数番目の入力は2倍にする

この当初の問題は奇数番目に入力された数字は2倍してその数が2桁の場合は各桁をさらに
たす必要があるのでその関数を以前ご指導のもと作っているので流用する
関数はこちら

test.py(入力数が10以上なら各桁を足し合わせる関数)
#!/usr/bin/env python
#coding:utf-8

def doubleDigitValue(digit):
    doubledDigit = digit * 2
    if (doubledDigit >= 10):
        sum = 1 + doubledDigit % 10 
    else:
        sum = doubledDigit
    return sum

そして、こちらをさきほどの

test.py(doubleDigitValue関数を追加)
#!/usr/bin/env python
#coding:utf-8

from ConsoleOut import cout
from test import doubleDigitValue


def number():
    checksum = 0
    for i in range(6):
        cout << "Enter a six-digit number:"
        digit = input()
        if i % 2 == 0:
            checksum += int(digit)
        else:  #奇数の場合、2倍して10以上なら各桁足し合わせる
            checksum += doubleDigitValue(int(digit)) 
    cout << "Checksum is " + str(checksum) + ". \n";
    if checksum % 10 == 0:
        cout << "Checksum is divisible by 10. Valid .\n"
    else:
        cout << "Checksum is not divisible by 10. Invalid. \n"
実行結果
>>> from test01 import number
>>> number()
Enter a six-digit number:1
Enter a six-digit number:1
Enter a six-digit number:1
Enter a six-digit number:1
Enter a six-digit number:1
Enter a six-digit number:1
Checksum is 9. 
Checksum is not divisible by 10. Invalid. 
>>> number()
Enter a six-digit number:2  #2
Enter a six-digit number:1  #1*2
Enter a six-digit number:1  #1 
Enter a six-digit number:1  #1*2
Enter a six-digit number:1  #1
Enter a six-digit number:1  #1*2
Checksum is 10. 
Checksum is divisible by 10. Valid .
>>> 
#問題解決しました。ありがとうございます!

最初の結果として
(1*2)+1+(1*2)+1+(1*2)+1 = 9 //1回目
なんだろう結果が表示されてみると最初はあってるっぽいけど
2回目に入力してるのは違う気がする。
(2*2)+1+(1*2)+1+(1*2)+1 = 10??? //2回目
不十分な状況ですがもう少し考えてみます。

2
2
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2