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;
	

}



                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值