本文已参与「新人创作礼」活动,一起开启掘金创作之路。
算法功能:该算法可对实际食品经营许可证号码等符合《GB/T 17710-1999 校验码算法》的校验码计算,代码经过实际使用测试。
代码实现过程
/**
*
*/
package idt.algorithm;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* @author 作者 Your-Name:
* @version 创建时间:2022年4月8日 下午2:13:31
* 类说明
*/
/**
* @author Dell
*2022年4月8日
*/
public class Util {
// 求Pn
private int getPn(int n,List<Object> arr1) {
if (n ==1) {
return 10;
}else {
return mod10(getSn(n - 1, arr1)) * 2;
}
}
//求特定的取余10的结果
private int mod10(int num) {
if (num%10 == 0) {
return 10;
}else {
return num % 10;
}
}
//求Sn
private int getSn(int n,List<Object> arr1) {
// int a =0;
// try {
// a = ;
// } catch (Exception e) {
// System.out.println(e.getMessage());
// System.err.println(14-n+1);
//// System.out.println((String) arr1.get(14-n+1));
// }
return getPn(n, arr1) % 11 + Integer.parseInt(arr1.get(14-n+1)+"");
}
//求校验码
public Object getCheckCode(String code) {
String c = code+"x,";
List<Object> arr1 = new ArrayList<Object>();
String[] split = c.split("");
for (int i = split.length-1; i >=0; i--) {
arr1.add(split[i]);
}
for (int i = 0; i < 10; i++) {
arr1.set(1, i);
if (getSn(14, arr1)%10 == 1) {
arr1.remove(0);
Collections.reverse(arr1);
StringBuffer stringBuffer = new StringBuffer();
for (Object string : arr1) {
stringBuffer.append(string);
}
return stringBuffer.toString();
}
}
return null;
}
public static void main(String[] args) {
String code = "1021409230066";
Util util = new Util();
System.out.println(util.getCheckCode(code));
}
}
注意: 该版本从python版本中翻译而来,经过测试,符合预期的结果,但在转换过程中,因语法不同,出现了较多的调整,例如java中list的操作与python中的list操作,方法体的定义方式,循环的写法等,均是较有意义的语法对比项,除了实现功能本身外,还可以作为两种语言学习的一个对比材料,可以较为直观的体会到两种语言的语法差异。
附件链接:download.csdn.net/download/lw…
参考链接:MOD 11,10算法(python版本)(GB/T 17710-1999 校验码算法)_mhn910的博客-CSDN博客