首页 > 其他 > 详细

华为笔试之CDkey的生成

时间:2014-04-09 17:05:04      阅读:477      评论:0      收藏:0      [点我收藏+]

时间:2014.04.09

地点:基地二楼

说明:这些练习尽量按Google C++标准规范编写,环境 VS2013,语言:C++11

--------------------------------------------------------------------------------

一、题目

某软件需要实现建议的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<string>
#include<bitset>
using namespace std;
string GenerteCDKey(unsigned num_first,unsigned num_second,unsigned um_third);
//Precondition:
//Postcondition:
string StringReverse(const string& str);
//Precondition:
//Postcondition:
string GenrateCheck(const string& str);
//Precondition:
//Postcondition:
void FormatPrint(const string& str);
//Precondition:
//Postcondition:
int main()
{
	unsigned num_first, num_second, num_third;
	cin >> num_first >> num_second >> num_third;
	string CDKey = GenerteCDKey(num_first, num_second, num_third);
	FormatPrint(CDKey);
}
string GenerteCDKey(unsigned num_first, unsigned num_second, unsigned num_third)
{
	const string kCharacterTable = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
	bitset<16> bitvec_first(num_first), bitvec_second(num_second), bitvec_third(num_third);
	string str_cicle = bitvec_first.to_string() + bitvec_second.to_string() + bitvec_third.to_string();
	string reverse_string = StringReverse(str_cicle);
	bitset<48> bit_cicle(str_cicle);
	bitset<5> bit_loop;
	size_t index;
	string CDKey_left = "",CDKey="";
	for (size_t loop = 0; loop < 14; ++loop)
	{
		for (size_t i = loop*5; i < (loop*5+5);++i)
			bit_loop[i%5] = bit_cicle[i%48];
		index = bit_loop.to_ulong();	
		CDKey_left += kCharacterTable[index];
	}
	CDKey = CDKey_left + GenrateCheck(CDKey_left);
	return CDKey;
}
string StringReverse(const string& str)
{
	string reverse(48, ‘0‘);
	size_t index = 0;
	for (auto ch : str)
	{
		reverse[47-index] = ch;
		++index;
	}
	return reverse;
}
string GenrateCheck(const string& str)
{
	const string kCharacterTable = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
	unsigned sum = 0;
	for (auto ch : str)
		sum += ch;
	bitset<10> bitset_sum(sum);
	bitset<5> bitset_check_one;
	bitset<5> bitset_check_two;
	for (size_t i = 0; i < 5; ++i)
	{
		bitset_check_one[i] = bitset_sum[i];
		bitset_check_two[i] = bitset_sum[i + 5];
	}
	size_t index_one = bitset_check_one.to_ulong(), index_two = bitset_check_two.to_ulong();
	string check_str = "";
	check_str += kCharacterTable[index_one];
	check_str += kCharacterTable[index_two];
	return check_str;
}
void FormatPrint(const string& str)
{
	string out_str="";
	for (size_t index = 0; index < 16;++index)
	{
		out_str += str[index];
		if (index % 4 == 3&&index!=15)
			out_str += ‘-‘;
	}
	cout << out_str << endl;
}


华为笔试之CDkey的生成,布布扣,bubuko.com

华为笔试之CDkey的生成

原文:http://blog.csdn.net/u012333003/article/details/23253543

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!