计算校验码

该博客介绍了一种计算B进制数值校验码的方法,确保数值加上校验位后能被B-1整除。通过给定的进制B和B进制的正整数N,计算出符合要求的校验码。文章提供了输入输出格式,并展示了多个样例及其解释。

【问题描述】

传送一个B(B≤16)进制的数值N时,最后加上一个一位(B进制的)校验码,使得N加上校验位后能被B-1整除。比如十进制的数值12310,其校验码就是3,因为十进制数值123310能被9整除。16进制的数7816,其校验码为0,因为16进制的78016是15的倍数。超过十进制后,用字母a表示10,字母b表示11,字母c表示12,字母d表示13,字母e表示14,字母f表示15。

告诉你进制B,以及一个B进制的正整数N,要求你计算正整数N在B进制下的校验码。

【输入形式】

输入第一行正整数t (10 ≤ n ≤ 100),表示有多少组测试数据。

后面有t行,每行两个正整数B,N(2≤ B≤16),中间用一个空格隔开,B是10进制整数,N用B进制形式表示。测试数据保证没有非法的B进制数N(也即N中每一位都是在0到B-1之间,没有前导0)。

40%的测试数据N的位数L 1 ≤ L≤ 10;
30%的测试数据N的位数L 1 ≤ L≤ 102
20%的测试数据N的位数L 1 ≤ L≤ 103
10%的测试数据N的位数L 1 ≤ L≤ 104

【输出形式】

对于每组测试数据,输出一位占一行:正整数N在B进制下的校验码。(如果校验码可以为B-1,也可以为0,输出0)。

【样例输入】

4
10 123
16 78
16 1234321
12 ab

【样例输出】

3
0
e
1

【样例说明】

第一行的4表示有4组测试数据,下面四行,每行一组测试数据。
第一组测试数据 10进制数123 最后添加检验码3,10进制数1233是9(=10-1)的倍数
第二组测试数据 16进制数78 最后添加检验码0,16进制数780是15(=16-1)的倍数
第三组测试数据 16进制数1234321 最后添加检验码e(=14),16进制数1234321e是15(=16-1)的倍数
第四组测试数据 12进制数ab 最后添加检验码1,12进制数ab1是11(12-1)的倍数

【Tips】

B进制的数能被B-1整除,当且仅当各位数字和能被B-1整除。
第一组测试数据 10进制数123 最后添加检验码3,10进制数1233各位数字和是9,是9的倍数
第二组测试数据 16进制数78 最后添加检验码0,16进制数780各位数字和是15,是15的倍数
第三组测试数据 16进制数1234321 最后添加检验码e,16进制数1234321e各位数字和是30,是15的倍数
第四组测试数据 12进制数ab 最后添加检验码1,12进制数ab1各位数字和是22,是11的倍数

import java.util.Scanner;

public class Main5 {
    public static void main(String[] args) {
        char[] trans = new char[]{'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        while (n-- > 0) {
            int num = sc.nextInt();
            char[] str = sc.next().toCharArray();
            int sum = 0;
            for (char c : str) {
                if (c <= '9') {
                    sum += c - 48;
                } else {
                    sum += c - 87;
                }
            }
            int mod = sum % (num-1);
            System.out.println(mod == 0 ? '0' : trans[(num-1) - mod]);
        }
    }
}
在 BarTender 软件中,可以通过内置的校验码计算功能来实现条形码中校验码的自动计算和添加。以下是具体的设置方法: ### 1. 设置校验码的通用方法 在 BarTender 中,校验码计算通常与条形码的类型相关。对于支持校验码的条形码类型(如 UPC、EAN、Code 128 等),软件会自动处理校验码计算并附加到条形码末尾。设置步骤如下: - **选择条形码对象**:在 BarTender 的设计界面中,选择需要添加校验码的条形码对象。 - **打开条形码属性**:右键点击条形码,选择“属性”或双击条形码进入编辑模式。 - **启用校验码功能**:在“符号体系和大小”选项卡中,找到“校验码”或“检验位”选项。勾选“自动计算校验码”或类似选项,具体名称可能因条形码类型而异。 - **选择校验码算法**:如果需要手动选择校验码类型,可以在“检验位类型”中选择适合的算法(如 Mod 10、Mod 11、Mod 43 等)。不同的条形码标准支持不同的校验算法,需根据实际需求选择 [^2]。 ### 2. 对于特定条形码类型的设置 #### UPC-A 或 EAN-13 对于 UPC-A 或 EAN-13 等条形码格式,BarTender 会自动根据标准规则计算校验码。只需确保输入的数字长度符合标准(UPC-A 需要 11 位,EAN-13 需要 12 位),软件会在生成条形码时自动添加校验码 [^3]。 #### Code 128 对于 Code 128 条形码,BarTender 会根据字符集和校验码规则自动计算校验码。Code 128 的校验码是通过以下公式计算的: ``` 校验码 = (起始码 + Σ(每个字符的权重 × 其位置) ) % 103 ``` 在 BarTender 中,确保“校验码”选项已启用,软件会自动完成计算 [^4]。 ### 3. 自定义校验码计算 如果需要使用自定义规则计算校验码(例如在 Excel 中通过公式计算),可以先在外部工具中计算校验码,然后将完整数据导入 BarTender。例如,对于 UPC 条形码,可以使用以下 Excel 公式计算校验码: ```excel =RIGHT(100-(MID(J2,1,1)+MID(J2,3,1)+MID(J2,5,1)+MID(J2,7,1)+MID(J2,9,1)+MID(J2,11,1))*3+(MID(J2,2,1)+MID(J2,4,1)+MID(J2,6,1)+MID(J2,8,1)+MID(J2,10,1)),1) ``` 将计算结果附加到原始数据末尾后,再导入 BarTender 中生成条形码 [^3]。 ### 4. 编程实现校验码计算 如果需要通过编程方式实现校验码计算(例如在 PHP 中),可以参考以下 Code 128 的校验码计算逻辑: ```php function calculateCheckDigit($data) { $checkSum = 0; $length = strlen($data); for ($i = 0; $i < $length; $i++) { $charValue = ord($data[$i]) - 32; // 转换为扩展 ASCII 值 $checkSum += $charValue * ($i + 1); // 根据位置加权 } return $checkSum % 103; // 根据 Code 128 规则取模 } $data = "ABC123"; echo "校验码:" . calculateCheckDigit($data); ``` 此代码片段展示了如何计算 Code 128 条形码的校验码,具体逻辑可根据实际需求调整 [^4]。 ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值