华为笔试之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
- 华为笔试之CDkey的生成
- CDKey生成,,
- cdkey和激活码的生成
- 华为的笔试题
- 华为的笔试题
- 华为笔试之字符串旋转
- 华为笔试之最长单词
- 华为笔试之字符串过滤
- 【逃离华为之面试、笔试】
- SQL要求CDKEY的解决办法
- python学习------生成cdkey小程序
- 华为的一道笔试题
- 华为的一道笔试题目
- 华为的一道笔试题
- 华为的JAVA笔试题
- 华为笔试题之字符串压缩
- 华为上机笔试题之约瑟夫环
- 华为笔试
- 创建单例的两种方式
- 博客皮肤小调查
- Accelerated C++ 习题解答 第13章
- iframe高度自适应的设置
- hdu 1263 水果
- 华为笔试之CDkey的生成
- 基础入门-JAVA字符集详解
- 学习日记2014-4-9第一个程序
- 第五周作业——有向图邻接表表示及反向图构造
- 性能loadrunner--web_find与web_reg_find
- 科技媒体说雅虎要出高价收购在线视频服务NDN公司 高达3亿美元
- 巨大机遇?摩根大通建议苹果推iOS笔记本
- 10344 - 23 out of 5
- shell批量给文件增加前缀和后缀