华为笔试题

来源:互联网 发布:sql server pdf下载 编辑:程序博客网 时间:2024/06/05 13:28

一、题目

某软件需要实现建议的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

源码:

// ConsoleApplication17.cpp : 定义控制台应用程序的入口点。
//cd_key


#include "stdafx.h"
#include<iostream>
#include<string>
#include<bitset>
#include<vector>
#include"math.h"
using namespace std;
char charactr[35] = { "23456789ABCDEFGHJKLMNPQRSTUVWXYZ\0" };


bitset<48> GenBit(bitset<16> _first, bitset<16> _second, bitset<16> _third){
bitset<48> cirbit;
for (int i = 0; i < 48; i++){
if (i < 16){
if (_third.test(i)){
cirbit.set(i);
}


}
else if (i < 32){
if (_second.test(i % 16)){
cirbit.set(i);

}

}
else{
if (_first.test(i % 16)){
cirbit.set(i);
}
}
}
return cirbit;
}
void  GetChar(bitset<48> bset, char *a, vector<char>& vec){
int i, j, k=-1;
bitset<5> subbit;
for (i = 0; i <= 70; i++){
if (i%5 == 0){
k++;
if (k>0){
int sum = 0;
for (int mm = 0; mm < 5; mm++){
sum += subbit[mm]*pow(2, mm);
}
//cout <<k-1<<":"<< sum << endl;
vec.push_back(charactr[sum]);
}
subbit.reset();
}
if (bset.test(i % 48)){
subbit.set(i% 5);

}
}


}
void GenYY(vector<char> &vec, char *a){
vector<char>::iterator iter;
int sum = 0;

for (iter = vec.begin(); iter != vec.end(); iter++){
//cout << *iter << endl;
sum += (*iter);
}
bitset<10> b(sum);
int num=0;
for (int i = 0; i <= 10; i++){
if (i % 5 == 0 && i>0){
cout << num << endl;
vec.push_back(charactr[num]);
num = 0;
}
if (i <= 9 && b.test(i)){
num += pow(2, i % 5);
}

}

}
void printcharacter(vector<char> &vec){
vector<char> vec2(vec);
int i = 0,j=1;

while (i<vec2.size()){
if (i% 4 == 0 && i>0  ){
cout <<"-";
}
char a = vec2[i];
cout <<a ;
i++;
j++;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
bitset<48> bset;
vector<char> vec;
vector<char>::iterator iter;
bset=GenBit(1, 1, 1);
//cout << bset << endl;
GetChar(bset, charactr, vec);
GenYY(vec, charactr);
for (iter = vec.begin(); iter != vec.end(); iter++){
cout << *iter << endl;
}
printcharacter(vec);
system("pause");
return 0;
}


0 0
原创粉丝点击