Простенькая реализация проверки корректности ИНН - выдрано из чужих
PL/SQL'евских сорцов и "лоб в лоб" перенесено на C. Есть еще "порт"
на Visual Basic в Excel, но это уж совсем оффтопик :-)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char ** argv) {
int i;
int buf;
int len;
int cnst[11];
char inn_to_check[13];
if (argc!=2) {
fprintf (stderr,"Use: %s <inn_number>\n",argv[0]);
return 4;
}
if ((strlen(argv[1])!=10)&&(strlen(argv[1])!=12)) {
fprintf (stderr,"Bad INN - length must be 10 or 12 digits\n");
return 3;
}
for (i=0;i<strlen(argv[1]);i++) {
if ((argv[1][i]<'0')||(argv[1][i]>'9')) {
fprintf (stderr,"Bad INN - it contains non-digital symbols\n");
return 2;
}
}
cnst[0] = 3;
cnst[1] = 7;
cnst[2] = 2;
cnst[3] = 4;
cnst[4] = 10;
cnst[5] = 3;
cnst[6] = 5;
cnst[7] = 9;
cnst[8] = 4;
cnst[9] = 6;
cnst[10] = 8;
strcpy ( inn_to_check, argv[1] );
len = strlen ( inn_to_check );
if (len == 10) {
buf = 0;
for (i=0 ; i < len-1 ; i++) {
buf += (inn_to_check[i]-'0') * cnst[2+i];
}
buf = (buf % 11) % 10;
if (inn_to_check[len-1] != ('0'+buf)) {
fprintf (stderr,"Bad INN:10 - checksum doesn't match\n");
return 1;
}
} else {
buf = 0;
len=11;
for (i=0 ; i < len-1 ; i++) {
buf += (inn_to_check[i]-'0') * cnst[1+i];
}
buf = (buf % 11) % 10;
if (inn_to_check[len-1] != ('0'+buf)) {
fprintf (stderr,"Bad INN:12 - checksum doesn't match on level 1\n");
return 1;
}
buf = 0;
len=12;
for (i=0 ; i < len-1 ; i++) {
buf += (inn_to_check[i]-'0') * cnst[i];
}
buf = (buf % 11) % 10;
if (inn_to_check[len-1] != ('0'+buf)) {
fprintf (stderr,"Bad INN:12 - checksum doesn't match on level 2\n");
return 1;
}
}
printf ("INN is good\n");
return 0;
}
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум pthread не работает (2006)
- Форум execve (2005)
- Форум c и iconv - помогите разобраться (2008)
- Форум математика (2005)
- Форум не работает inotify watch (2017)
- Форум non-blocking write (2011)
- Форум C, про типы (2005)
- Форум ofstream (2006)
- Форум stat() неправильно работает с cifs (2009)
- Форум покритикуйте функцию (2009)