CDKey生成,,

来源:互联网 发布:sql的update语句 编辑:程序博客网 时间:2024/06/10 01:17
/*****************************************************************某软件需要实现建议的CD-KEY算法,输入3个正整数,以空格隔开,根据这3个整数生成CD-KEY字符串,输出格式XXXX-XXXX-XXXX-XXYY,包括16个字符,以短划线分开,其中,CD-KEY最后两个YY是用于CD-KEY的自校验,确保CD-KEY本身是合法的。CDKEY使用的字符表23456789ABCDEFGHJKLMNPQRSTUVWXYZ(由于1和I,0和O不好区分,删除)请实现CDKEY的生成算法,原理如下:(1)输入的3个32bit的正整数,按顺序取每个整数的低16bit,假设为a,b,c串联生成一个48bit的环形,然后从低到高,每次去5个bit,并将其作为下标,从32字符表中取出相应字符,循环输出14个字符(提示:第一个输出的字符应该是c的低5bit生成)。(2)上面输出14个字符即为CDKEY的从左至右的14个字符,将这14个字符按照ascii码方式全部相加,取低10bit,从低到高,查表生成两个校验位。样例输入:1 1 1样例输出:3224-2262-2A22-J2CR*******************************************************************/#include<iostream>#include<cstdlib>#include<bitset>#include<string>using namespace std;int main(){int a,b,c;char asciic[32]={'2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'};cin>>a>>b>>c;bitset<32> bitsa(a),bitsb(b),bitsc(c);bitset<48> bitring;bitset<5> ascii;bitset<32> sumbit;int pos=32,sum=0;string CDKey;for(int i=0;i<16;i++){bitring[i]=bitsa[i];bitring[i+16]=bitsb[i];bitring[i+32]=bitsc[i];}for(int i=1,pos=32;i<=14;i++,pos=(pos+5)%48){for(int j=0;j<5;j++){ascii[j]=bitring[(j+pos)%48];}CDKey+=asciic[ascii[0]+2*ascii[1]+4*ascii[2]+8*ascii[3]+16*ascii[4]];sum+=asciic[ascii[0]+2*ascii[1]+4*ascii[2]+8*ascii[3]+16*ascii[4]];if(0==i%4)CDKey+='-';}sumbit=sum;CDKey=CDKey+asciic[sumbit[0]+2*sumbit[1]+4*sumbit[2]+8*sumbit[3]+16*sumbit[4]]+asciic[sumbit[5]+2*sumbit[6]+4*sumbit[7]+8*sumbit[8]+16*sumbit[9]];cout<<CDKey;}
不使用bitset和string类实现:
<pre name="code" class="cpp">#include<iostream>#include<cstdlib>using namespace std;int main(){int a[3];char asciic[]="23456789ABCDEFGHJKLMNPQRSTUVWXYZ";char CDKey[20]={'\0'};int bitring[3][16]={0};int pos=32,sum=0,ind=0,power=0;for(int i=0;i<3;i++)cin>>a[i];for(int i=0;i<3;i++){int temp=a[i];for(int j=0;j<16;j++){bitring[i][j]=temp%2;temp/=2;}}for(int i=0;i<3;i++)for(int j=0;j<16;j++)cout<<bitring[i][j];cout<<endl;for(int i=0;i<17;i++){if(i==4||i==9||i==14){CDKey[i]='-';continue;}for(int j=0;j<5;j++){if(0==j)power=1;elsepower*=2;ind=ind+bitring[(pos+j)%48/16][(pos+j)%48%16]*power;}CDKey[i]=asciic[ind];sum+=asciic[ind];pos=(pos+5)%48;ind=0;}CDKey[17]=asciic[sum&31];CDKey[18]=asciic[(sum>>5)&31];cout<<CDKey;}


                                             
0 0
原创粉丝点击