// ルーンチェックサム(ISBNコード:識別番号の算出)
#include <iostream>
using namespace std;
// 入力した数字の桁数を調べる
unsigned GetDigit(int64_t number) {
unsigned digit = 0;
while (number /= 10) {
++digit;
}
return digit;
}
// 識別番号の算出
void checkSumValue()
{
char digitChar; // 入力した数字
int oddLengthChecksum = 0; // 奇数桁の数値を合計した値
int evenLengthChecksum = 0; // 偶数桁の数値を合計した値
int position = 1; // 何桁目かを示す変数
int checksum = 0; // 奇数桁の合計 + 偶数桁の合計*3
int checkDigit = 0; // チェックディジット
digitChar = cin.get();
do {
if (position % 2 != 0) {
oddLengthChecksum += digitChar - '0';
} else {
evenLengthChecksum += digitChar - '0';
}
digitChar = cin.get();
position++;
} while(digitChar != 10);
checksum = oddLengthChecksum + evenLengthChecksum * 3;
if (checksum % 10 != 0) {
checkDigit = 10 - checksum % 10;
} else {
checkDigit = checksum % 10;
}
cout << "計算結果は " << checksum << "です。\n";
cout << "識別番号は " << checkDigit << "です。 \n";
}
// 入力した数字(char)を整数値(int64_t)に変換
void changeDigitChar()
{
char digitChar;
while (digitChar != 10) {
cin >> digitChar;
int64_t number = (digitChar - '0');
while (digitChar != 10) {
number = number * 10 + (digitChar - '0');
digitChar = cin.get();
}
cout << GetDigit(number);
}
}
int main()
{
int64_t number;
char digitChar;
cout << "ISBNコードの識別番号を求めます。12桁の数字を入力してください :";
changeDigitChar();
if (digitChar != 10 && GetDigit(number) == 12) {
checkSumValue();
} else {
cout << "12桁の数字ではありません。\n";
}
}
よろしくお願いします。