华为笔试之CDkey的生成

来源:互联网 发布:怎么学会c语言 编辑:程序博客网 时间:2024/06/09 18:17

时间: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;}


1 0
原创粉丝点击