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]

  

  

 

posted @ 2021-06-17 10:08  re0juren  阅读(155)  评论(0编辑  收藏  举报