MOD 11,10算法(java)(GB/T 17710-1999 校验码算法)

254 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

算法功能:该算法可对实际食品经营许可证号码等符合《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博客