import numpy as np
A = int(input())
B = int(input())
D = []
count = 0
countset = []
#错误写法:(我是真的傻--手动ci笑)
#n = B-A
#for i in range(n):
#i = i+1
#正确写法一:
#N = range(A,B+1)
#for i in N:
#正确写法二:
for i in range(A,B+1):
while i != 1:
if i % 2 == 0:
i = i//2
else:
i = (3*i+1)//2
D.append(i)#循环结果放在列表里面
count+=1
countset.append(count)
print(min(countset))#最小的循环长度
print(max(countset))#最大的循环长度
print(sum(countset)/len(countset))#平均循环长度
print(sum(D)/len(D))#循环结果的均值
for i in D:
if i == 1 or i ==2 :
D.remove(i)#求的是大2的众数,先把1和2扣掉
else:
continue
#求众数方法一(浮点数也考虑)
#from scipy import stats
#print(stats.mode(D)[0][0])
#求众数方法二(不考虑浮点数)
print(max(np.bincount(D)))#np.bincount(list)是求list中非负整数的个数
print(np.std(D))#标准差公式np.std(list)
补充:关于众数
#方法一:(利用numpy自带的函数)
import numpy as np
A = int(input())
B = int(input())
print("输入的值是:",A,B)
D = []
for i in range(A,B+1):
while i != 1:
if i % 2 == 0:
i = i//2
else:
i = (3*i+1)//2
D.append(i)
C = np.bincount(D)#这个得到的结果是一个数组,无法进行index操作
B =[]
for i in C:
B.append(i)#需要建立一个新list,把数据放进list
print("得到的众数是:",D[B.index(max(B))])#max(B)--出现最多的那个数的次数;并且根据次数把数的索引编号表示出来
方法二:(index()索引法)
a = int(input())
b = int(input())
print("输入的值为:",a,b)
C = []
D = []
for i in range(a,b+1):#卡拉兹循环
while i != 1:
if i % 2 == 0:
i = i//2
else:
i = (3*i+1)//2
D.append(i)#把循环结果加进来
for i in D:#遍历循环结果
C.append(D.count(i))#对每一个结果进行计数,并加到列表C中。
print("得到的众数是:",D[C.index(max(C))])#max(C)---出现最多次的那个计数结果#C.index()---对该值进行索引编号#D[]根据索引编号得出对应的值(得众数)
补充:循环次数最多的那个数(可能是对的(ci笑),老师出的,奇奇怪怪(ci笑))
try:
a = int(input())
b = int(input())
print("输入的值为:", a, b)
C = []
D = []
cic = 0
for i in range(a, b + 1): # 卡拉兹循环
while i != 1:
if i % 2 == 0:
i = i // 2
else:
i = (3 * i + 1) // 2
D.append(i) # 把循环结果加进来
cic += 1 # 循环次数(每循环一次就加个1)
C.append(cic) # 依次是[a,b]中的每一个数的循环次数
K = range(a, b + 1)[C.index(max(C))] # max(C)--是[a,b]中循环次数最多的那个次数
print("循环次数最多的那个数值为", K)
except:
print("输入有错误,请重新输入。")
放一下老师的版本:
import numpy as np
print("任意输入两个数值A、B,且1<A<B,\n对区间[A,B]之内的正整数做卡拉兹猜想")
try:
A=int(input("请输入A: "))#A=int(input("5"))
B=int(input("请输入B: "))
print("你输入的数据是:",A,B)
循环长度=[]#每个元素卡拉兹猜想的循环次数
循环结果=[]#每个元素卡拉兹猜想每次循环的结果
N = range(A,B+1)# 根据A,B产生列表[A,A+1,A+2,...,B-2,B-1,B]
#print(type(N))
#print(list(N))
#cic = 0
#[5,12]循环次数[4, 10, 21, 24, 37, 42, 52, 59]
for num in N:#开始进入卡拉兹猜想
cic = 0 # 循环长度计数,[5,12]循环次数[4, 6, 11, 3, 13, 5, 10, 7]
#print(num)
while num > 1:
if num%2==0:
num = num //2
else:
num = (num * 3 +1)//2
#print(num)
if num>2:
循环结果.append(num)
cic = cic + 1#print(cic)
循环长度.append(cic)
#print(循环长度)
#print(循环结果)
print("最大循环长度:",max(循环长度))
print("最小循环长度:",min(循环长度))
print("平均循环长度:",sum(循环长度)/len(循环长度))
print("循环结果均值:",np.mean(循环结果))
print("循环结果标准差:",np.std(循环结果))
#以下求众数
#思路一
'''1.对循环列表中的每个元素计数,形成计数序列,找其最大值的索引,
根据索引,在循环结果中提取对应数值,就是众数。
2.用传统比较法,找最大值。'''
次数列表=[]
for n in 循环结果:
次数列表.append(循环结果.count(n))
print("循环结果众数:",循环结果[次数列表.index(max(次数列表))])
except:
print("buky")
#思路二
'''max(次数列表):找到次数列表中的最大值
次数列表.index(次数列表中的最大值):找到次数列表最大值的索引编号
循环结果[次数列表最大值的索引编号]——>循环结果的众数'''