python《信息安全专业导论》期末考试内容(二)
目录:
1.西西弗斯黑洞
2.冰雹猜想
3.圣经数
4.卡普雷卡尔黑洞
5.数学黑洞1和4
6.水仙花数
7.完全数
8.亲密数
9.回文数
10.勾股数
11.四方定理
12.尼科彻斯定理
1 #西西弗斯黑洞:取随机数n,根据其偶数个数、奇数个数、随机数长度组成一个新的数,再重复上述步骤,最终一定会得到123。 2 number=input("非负整数:a(1)=") 3 i=1 4 while number != "123": 5 i+=1 6 a=0 7 l=len(number) #长度 8 for n in number: 9 a=a+(eval(n)%2) #奇数个数 10 b=l-a #偶数个数 11 number=str(b)+str(a)+str(l) 12 print("a("+ str(i) +")=",number,"")
1 #冰雹猜想:一个正整数x,如果是奇数就乘以3再加1,如果是偶数就除以2,重复上述操作,最终回到1。 2 n=int(input("正整数n=")) 3 while n != 1: 4 if n%2==0: 5 n=n/2 6 print(int(n)) 7 else: 8 n=n*3+1 9 print(int(n))
1 #圣经数:任意一个3的倍数,把各位数字的立方相加,得出和,再把和的各位数字立方后相加,如此反复进行,最后必然出现“圣经数153”。 2 i=input("随机正整数i=") 3 number=3*i 4 while number != "153": 5 a=0 6 for n in number: 7 a=a+(eval(n))**3 8 number=str(a) 9 print(number)
1 # 卡普雷卡尔黑洞:取任何一个4位数(4个数字均为同一个数字的除外),将组成该数的4个数字重新组合成可能的最大数和最小数, 2 # 再将两者求差;对此差值重复同样过程,最后总是达到卡普雷卡尔黑洞值:6174。 3 x=int(input("各位不都相等的4位数=")) 4 def to_array(x): 5 list = [] 6 for i in range(4): 7 a=x%10 8 list.append(a) 9 x=int(x/10) 10 return list 11 def to_number(list): 12 num=0 13 for i in range(4): 14 num=num*10+list[i] 15 return num 16 while x !=6174: 17 list=to_array(x) 18 list.sort() 19 min=to_number(list) 20 list.sort(reverse=True) 21 max=to_number(list) 22 x=max-min 23 print(x)
1 #数学黑洞1和4:任取一个非0自然数,求出它的各个数位上数字的平方和,得到一个新数;重复上述步骤,如此进行到最后只有两种情况: 2 # 出现1,之后永远都是1;出现4,之后开始按4、16、37、58、89、145、42、20循环。 3 number=input("非0自然数=") 4 while 1 : 5 a=0 6 for n in number: 7 a=a+(eval(n)**2) 8 number=str(a) 9 print(number)
1 #水仙花数:一个3位数每个位上的数字的3次幂之和等于它本身 2 for n in range(100,1000): 3 a=n//100 4 b=(n//10)%10 5 c=n%10 6 k=a**3+b**3+c**3 7 if n==k: 8 print(n)
#完全数:一个数恰好等于它的真因子(即除了自身以外的约数)之和 for n in range(1,1000): a=0 for i in range(1,n): if n%i==0: a=a+i if n==a: print(n)
1 #亲密数:如果整数A的真因子之和等于B,且整数B的真因子之和等于A,则将整数A和B称为亲密数。 2 n=int(input("范围为1~")) 3 def f(n): 4 s = 0 5 for i in range(1,n): 6 if n % i == 0: 7 s=s+i 8 return s 9 for b in range(1,n): 10 a = f(b) 11 if b == f(a) and a<b: 12 print(a,b)
1 #回文数:任意自然数的各位数字反向排列所得自然数n1与n相等 2 N=int(input("范围为0~")) 3 for x in range(0,N): 4 str_x = str(x) 5 if len(str_x) > 1: 6 for i in range(0,int(len(str_x)/2)): 7 if str_x[i] == str_x[-i-1]: 8 print(x) 9 else: 10 print(x)
1 #勾股数:可以构成一个直角三角形三边的一组正整数。 2 n=int(input("范围为1~")) 3 for a in range(1,n): 4 for b in range(1,a): 5 for c in range(1,b): 6 if a==(b**2+c**2)**(1/2): 7 print(c,b,a)
1 #四方定理:所有自然数至多只要用四个数的平方和就可以表示。 2 n=int(input("自然数n=")) 3 for a in range(0,n): 4 for b in range(a,n): 5 for c in range(b,n): 6 for d in range(c,n+1): 7 if n==a**2+b**2+c**2+d**2: 8 print(a,b,c,d)
1 #尼科彻斯定理:任何一个整数m的立方都可以写成m个连续奇数之和,且m属于[1,100]。 2 m=int(input("输入属于1~100的整数m:")) 3 list=[] 4 a = m**2-m+1 5 for i in range(a,a+m*2,2): 6 list.append(i) 7 sum=m*(m+a-1) 8 if m**3==sum: 9 print(list)