答复
代码:
//不是把。。。
//刚才仔细看了看,写了一个版本的注册机,能算出注册码,但是不是很满意,有点投机呵呵
//大家将就看看,希望对你们的分析有帮助
#include <stdio.h>
#include <string.h>
#define MAX_LEN_OF_STRING 50
int main()
{
const int MIN_LEN_OF_NAME=10;
const int MAX_LEN_OF_NAME=24;
char name[MAX_LEN_OF_STRING]="";
char sn[MAX_LEN_OF_STRING]="";
char magicString[]="i am Bin Laden";
int lenOfName,
lenOfMagicString,
lastCharIndex,
lenOfSerial;
int i,j;
//录入用户名,确保符合长度
do{
printf("Plz input your name:");
scanf("%s", name);
lenOfName = strlen(name);
if(lenOfName < MIN_LEN_OF_NAME)
printf("Name should be at least %d characters!\r\n", MIN_LEN_OF_NAME);
else if(lenOfName > MAX_LEN_OF_NAME)
printf("Name should no more than %d characters!\r\n", MAX_LEN_OF_NAME);
else
goto goodway;
}while(1);
goodway:
strcat(name,magicString);
//下面的计算保证10位的用户名对应17位的序列号
lenOfMagicString = strlen(magicString);
lastCharIndex = lenOfName+lenOfMagicString-3;
for(i=0; i<26; i++)
{//穷举得到序列号第一位
if(((name[lastCharIndex]*(i+0x41)-i)%26)==0)
{
sn[0]=0x41+i;
break;
}
}
//每一位的计算都用到了第一位,然后用倒叙存储
for(i=1,j=lastCharIndex-1;
j>=5;
i++,j--)
sn[i]=((name[j]*sn[0])%26) + 0x41;
lenOfSerial = lastCharIndex - 5 + 1;
sn[lenOfSerial]='\0';
printf("The serial number is %s .\r\n", sn);
getch();
return 0;
}
