我有一个小问题。我编写了一个程序,要求用户输入包含 11 位数字的代码。我将其定义为字符串,但现在我想单独使用此代码中的每个数字并制作一个方程式。
例如,如果代码是
37605030299
,我需要做方程:
(1*3 + 2*7 + 3*6 + 4*0 + 5*5 + 6*0 + 7*3 + 8*0 + 9*2 + 1*9) / 11
并找出 MOD 是什么。
这是 ISBN 校验位的计算。
使用循环代替。 (我只显示总值和校验位计算 - 您需要首先将用户输入自己输入名为
UserISBN
的变量中。)
function AddCheckDigit(const UserISBN: string): string;
var
i, Sum: Integer;
CheckDigit: Integer;
LastCharValue: string;
begin
Assert(Length(UserISBN) = 10, 'Invalid ISBN number.');
Sum := 0;
for i := 1 to 10 do
Sum := Sum + (Ord(UserISBN[i]) * i);
{ Calculate the check digit }
CheckDigit := 11 - (Sum mod 11);
{ Determine check digit character value }
if CheckDigit = 10 then
LastCharValue := 'X'
else
LastCharValue := IntToStr(CheckDigit);
{ Add to string for full ISBN Number }
Result := UserISBN + LastCharValue;
end;
char
到 0
的 9
值存在,并且是连续的并且相对于其数值按升序排列。
因此,您可以使用 char
值作为输入并计算 ord('4') – ord('0')
等表达式来获取 integer
值 4
。
program checkDigit(input, output);
type
{ This is guaranteed to comprise exactly 10 `char` values. }
decimalDigit = '0'‥'9';
{ Valid index of a component in ISBN10identifier string. }
ISBN10identifierIndex = 1‥9;
{ Legacy 10‑digit ISBN without check digit. }
ISBN10identifier = array[ISBN10identifierIndex] of decimalDigit;
var
digit: ISBN10identifier;
checkDigitValue: 0‥10;
begin
{ This will crash if you do not enter 9 decimal digit characters. }
readLn(digit[ 1], digit[ 2], digit[ 3], digit[ 4], digit[ 5],
digit[ 6], digit[ 7], digit[ 8], digit[ 9]);
{ Obviously this “formula” may benefit from using a `for` loop. }
checkDigitValue ≔ (ord(digit[1]) * 1 + ord(digit[2]) * 2 +
ord(digit[3]) * 3 + ord(digit[4]) * 4 +
ord(digit[5]) * 5 + ord(digit[6]) * 6 +
ord(digit[7]) * 7 + ord(digit[8]) * 8 +
ord(digit[9]) * 9 − 45 * ord('0')) mod 11;
{ Select alternative character for `checkDigitValue` equaling ten. }
writeLn(('0123456789X')[checkDigitValue + 1])
end.
maxInt
≥ 999,999,999,您可能需要使用 integer
。
编写诸如 n div 10000 mod 10
之类的表达式来隔离各个数字值。
program checkDigit(input, output);
var
{ To ensure your algorithm isn’t totally wrong use sub‑ranges. }
ID: 0‥999999999;
{ The initial `value` construct is defined by Extended Pascal. }
weightedSum: 0‥729 value 0;
{ Exponent in 10⁰ = 1, 10¹ = 10, 10² = 100, …, 10⁸ = 100,000,000. }
i: 0‥8;
begin
{ NB: This accepts _any_ valid Pascal `integer` literal (e.g. +42). }
readLn(ID);
{ Accumulate `weightedSum`. }
for i ≔ 0 to 8 do
begin
{ The `pow` operator is defined by Extended Pascal. }
weightedSum ≔ weightedSum + ID div (10 pow i) mod 10 * (9 − i)
end;
{ Print the entire ISBN including the check digit (`X` for ten). }
writeLn(ID:9, ('0123456789X')[weightedSum mod 11 + 1])
end.