我试图弄清楚如何使用C#进行此计算,我对此很新。 我有一个数据输入字段,将采用9位数字。 现在我想将每个数乘以相应的权重。所以第一个数字乘以7,接下来乘以3,接下来乘以1,这是重复模式(7,3,1,7,3,1,7, 3,1等)。 然后我想将结果相加,然后将总数除以10.余数是校验位。
快速示例将输入以下数据:308381911
所以它将是(3 * 7)+(0 * 3)+(8 * 1)+(3 * 7)+(8 * 3)+(1 * 1)+(9 * 7)+( 1 * 3)+(1 * 1)= 142
然后142/10 = 14,其余为2
因此校验位为2。
由于
更新:道歉,我错过了输入字段是一个字符串。
答案 0 :(得分:1)
我假设您有一个名为number
的9个字符的字符串,其中包含数字。
我们将使用for循环,一次消耗三个字符并将它们与各自的权重相加。这意味着我们将使用索引3 * i
,3 * i + 1
和3 * i + 2
。他们会给每个人一个字符(即'0'
和'9'
之间的某个字符),这样我们就可以减去" '0'
找到与当前数字对应的偏移量。
然后将其转换为整数,乘以相应的权重并相加。最后,我们需要在除以10时找到余数。这正是%
- 运算符的作用。
var total = 0;
for (var i = 0; i < 3; i++)
{
total += 7 * (int)(number[3 * i] - '0');
total += 3 * (int)(number[3 * i + 1] - '0');
total += 1 * (int)(number[3 * i + 2] - '0');
}
total %= 10;
现在,total
将包含校验位作为整数。如果您需要角色,请使用
var result = (char)(total + '0');
答案 1 :(得分:0)
如果你在职业生涯的某个阶段喜欢LINQ,这是一种有趣的方式:
string N = "308381911";
var P = string.Join("", Enumerable.Repeat("731", (int)Math.Ceiling(N.Length / 3))).Substring(0, N.Length);
var R = N.Zip(P, (a, b) => int.Parse(a.ToString()) * int.Parse(b.ToString())).Sum() % 10;
N
是您的号码,以字符串形式。P
是一个包含“731731731 ...”的字符串,长度等于N的长度。Zip()
函数在我们的例子中采用两个序列(N
和P
)并在每个相应的元素上应用一个函数(此处为乘法)。然后Sum()
汇总所有乘法结果并将其模数为10以得到校验和数字。答案 2 :(得分:0)
使用可变大小模式,可以在一行中完成,如下所示:
var a = "308381911".Select((c, i) => (c - '0') * ( "731"[i % 3] - '0')).Sum() % 10; // 2
var b = "308381911".Select((c, i) => (c - '0') * ("7341"[i % 4] - '0')).Sum() % 10; // 9
或使用完整模式
var x = "308381911".Zip("731731731", (d, p) => (d - '0') * (p - '0')).Sum() % 10; // 2
没有LINQ这样做会让它看起来像是一个家庭作业问题,但是像这样的事情
int[] input = { 3, 0, 8, 3, 8, 1, 9, 1, 1 };
int[] pattern = { 7, 3, 1, 7, 3, 1, 7, 3, 1 };
int total = 0;
for (int i = 0; i < input.Length; i++)
total += input[i] * pattern[i];
int check = total % 10; // total = 142, check = 2