2021强网杯ezmath复现
主验证函数如下:
a1为输入,通过传参和i的取值可以判定a1为输入的连续两个字符拼接成的ascall码值。加密程序是用输入的flag值控制循环次数来加密,可以抽象出一个递推数列公式:
fn+1=e-n*fn; (fn+1=e-(8225+n-1)*fn)
只需要求出fn关于n的通项即可,n是关于flag和8225直接的一个差值关系,而fn就是最后的加密数字
fn=(e-fn+1)/n,可以写出解密程序:
result=0.00009794904266317233 //最后一个fn+1
for(j=0xffff;j>=8225;j--){ for(i=j; i>=8225;i--) //i为输入值,控制循环次数 { result=(2.718281828459045-result)/i*1.0; //fn=(e-fn+1)/n
//经过i-8225次循环后, } printf("%.30lf\n",result); }
输出收敛,说明数列收敛
可以求出通项fn=e/n+1;
d=[0.00009794904266317233, 0.00010270456917442, 0.00009194256152777895, 0.0001090322021913372, 0.0001112636336217534, 0.0001007442677411854, 0.0001112636336217534, 0.0001047063607908828, 0.0001112818534005219, 0.0001046861985862495, 0.0001112818534005219, 0.000108992856167966, 0.0001112636336217534, 0.0001090234561758122, 0.0001113183108652088, 0.0001006882924839248, 0.0001112590796092291, 0.0001089841164633298, 0.00008468431512187874] e=2.718281828459045 flag='' for i in range(len(d)): f=int(e/d[i])-1 f1=chr(int('0x'+hex(f)[2:4],16)) f2=chr(int('0x'+hex(f)[4:6],16)) flag+=f2+f1 print(flag)
1.知识点一:浮点数转化为对应的二进制(十六进制)IEEE标准
32bit二进制转换:
64bit二进制转换:
//求小数点后二进制的∑2^i
int main(){ int i; char s[53]="0000000000000000000000000000000000000010000000100010"; for(i=0;i<53;i++){ double a; a=powerr(2,-(i+1)); if(s[i]=='1') printf("%.36f\n",a);} return 0;}
/*
0.000000000001818989403545856500000000
0.000000000000007105427357601001900000
0.000000000000000444089209850062620000*/
#求和
s=[0.000000000001818989403545856500000000, 0.000000000000007105427357601001900000, 0.000000000000000444089209850062620000] res=0 for i in range(len(s)): res+=s[i] print('%.40f'%res) print(res)
2.python脚本常用的数据转换函数
1.int(x,base):转换为一个整数
#x为一个数字,不能用base参数,将其向下取整
#x可以为字符串,使用base指定字符串的数据类型
int(2.23)
#print:2
int('0xa',16)
#print:10
int('1001',2)
#print:9
2.str(object):将对象转换为字符串
#object为字符,数字等
str('a')
#print:'a'
str(2*3)
#print:'6'
3.chr():接收0-255的整数,十进制或十六进制表示,返回对应的字符
chr(0x61)
#print:a
chr(61)
#print:a
4.hex():接收一个十进制数,转换为十六进制
hex(10)
#print:a
5.bin():接收一个整数,返回他的二进制 bin(10) #'0b1010' bin(1) #'0b0001'
6.float():接收整数或字符串,转换为浮点数 float(123) #123.0
字符串运算符
1.字符串连接:''+''
a='123'
b='abc'
c=a+b
print(c)
#123abc
2.截取字符串的一部分:[:]
#[x:y]:字符串下标从0开始,取下标为x到y的字符串,前闭后开
#[:y]从第一个到下标y-1
#[x:]从x下标到最后一个
a='1234567'
a[1:3]
#'234'
a[2:]
#'34567'
a[:4]
#'1234'
3.成员运算符in /not in
a='123455'
'1'in a
#True
'0'in a
#False
4.join字符串连接 a='_' seq=('123','asd','zsc') a.join(seq) #'123_asd_zsc'
其他内置函数:
raw_input():以字符串格式接收用户输入 a=raw_input("input your ans:") #input your ans:123 #a='123'
reverse方法:将列表中的元素逆序 aList = [123, 'xyz', 'zara', 'abc', 'xyz'] aList.reverse()
#
List : ['xyz', 'abc', 'zara', 'xyz', 123]