今天写程序遇到了算法,刚开始不太明白,后来去网上查,能查到的资料也很少,大部分都是通过写的一个shell实现的,并且都如出一辙,可能都是对着抄袭的吧,
说明:以下资料部分是从网上搜索得到,只是引用,不做商业用途,如有侵权,请联系本人。
1.首先介绍模10、11双模算法。双模算法是国标的其中一个,即GBT 17710,可以防止在抄录和键入字符串时产生的错误。本标准规定了一组校验字符系统,它可以防止在复制或者键入数据时产生错误,包括单一字符录入错误(比如12345错录为02345)、所有的或者几乎所有的单一字符兑换位置错误(12345错录为12354)、所有或者几乎所有的循环移位错误,大部分的双替换错误(12345错录为22356),大部分的其它错误等
2.算法公式及解释如下(网上找的,是对的):
3.附上C源码:
int Mode(char * str){ int m=10; int number=0; int n=0; int p=m; int i=0; int j=0; j = strlen(str); for(i=0;i<j;i++){ number=(int)(str[i]-48); p=((n=(p+number)%m)?n:m)*2%(m+1); printf("good[%d]number[%d]\r\n",i,number); } if(p<2){ p=1-p; }else{ p=11-p; } return p;/*返回一个校验数字*/ }
PS:这个源码是根据那个shell改造的,字符串全为数字时适用,如有同学有时间可以继续改造下,没时间了,要下班了,呵呵。