此文章是vip文章,如何查看?  

1,点击链接获取密钥 http://nicethemes.cn/product/view29882.html

2,在下方输入文章查看密钥即可立即查看当前vip文章


CDKey生成,,

  • 时间:
  • 浏览:
  • 来源:互联网
/*****************************************************************
某软件需要实现建议的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;
	

}



                                    

本文链接http://element-ui.cn/news/show-576768.aspx