/*****************************************************************
某软件需要实现建议的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;
else
power*=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;
}