CD key 生成
题目描述如下:
某欧软件需要实现简易的CD-KEY算法,输入3个正整数,以空格隔开,根据者3个正整数生成的cd-key字符串。输出格式:xxxx-xxxx-xxxx-xxyy。
包含16个字符,以短划线隔开,其中,cd-key的最后两位yy是用于cd-key的自校验,确保cd-key本身是合法的。
cd-key使用的字符表:23456789ABCDEFGHJKLMNPQRSTUVWXYZ(共32个,由于1和I,0和O难以辨识,被剔除)
实现原理如下:
(1),输入3个32bit正整数,按顺序取每个正整数取低16bit,假设a,b,c,将abc串联在一起组成48bit的唤醒,然后从低到高,每次取5个bit,
用其取值作为下标,从32字符表中查出对应的字符,循环输出14个字符(提示:第一个输出的字符应该是c的低5bit)。
(2),上面输出的14个字符即cd-key的从做至右的前14个字符的ascll求和,从低到高,每5bit为下标,查表生成两个字符,作为第15,16,个cd-key
的字符即为yy
时间限制:无
内存限制:无
输入: 输入3个正整数,以空格隔开
样例输入:1 1 1
样例输出:3224-2262-2A22-J2CR
答案
python:
num=raw_input() char_table="23456789ABCDEFGHJKLMNPQRSTUVWXYZ" str_14='' str_15='' str_16='' result='' num2 = 0 bin_num1 = str(bin(int(num[0]))).replace('0b','') bin_num2 = str(bin(int(num[2]))).replace('0b','') bin_num3 = str(bin(int(num[4]))).replace('0b','') bin_48 = bin_num1.zfill(16) + bin_num2.zfill(16) + bin_num3.zfill(16) for i in range(14): str_14=str_14+char_table[int(bin_48[-5:],base=2)] bin_48 = bin_48[-5:]+bin_48[:-5] for i in range(14): num2 = ord(str_14[i]) +num2 tmp_str_2=str(bin(int(num2))).replace('0b','').zfill(32)[-10:] str_15=char_table[int(tmp_str_2[-5:],base=2)] str_16=char_table[int(tmp_str_2[:-5],base=2)] result_tmp=str_14+str_15+str_16 for i in range (16): if i % 4 == 0 and i!=0: result=result+'-'+result_tmp[i] else : result = result+result_tmp[i] print result