import random from cfractions import Fraction def create_number(i): get_number = random.randint(0, int(i)) # print(get_number) return get_number def create_sign(): sign = ['+', '-', '*', '÷'] get_sign = random.choice(sign) # print(get_sign) return get_sign def create_formula(flag_num): total = [3, 5, 7] flag = random.choice(total) # 生成算式 result数组 result = [] for i in range(flag): # print(i) if i % 2 == 0: number = create_number(flag_num) result.append(number) else: sign = create_sign() if (i+1) != flag: result.append(sign) # print(result) # print("加入括号") length = len(result) brackets = [0, 1] bracket = random.choice(brackets) if length > 3: # 随机加入括号 if bracket == 1: for i in range(length): if result[i] == '+' or result[i] == '-': result.insert(i-1, '(') result.insert(i+3, ')') break # print(result) formula = str(str(result).replace("'", "").replace( ',', '')).replace('[', '').replace(']', '') # 计算 while len(result) != 1: if '(' in result: number_sign = result.index('(')+2 if result[number_sign] == '+': number_num = result[number_sign - 1] + result[number_sign + 1] result[number_sign - 2] = number_num result.remove(result[number_sign - 1]) result.remove(result[number_sign - 1]) result.remove(result[number_sign - 1]) result.remove(result[number_sign - 1]) elif result[number_sign] == '-': number_num = result[number_sign - 1] - result[number_sign + 1] result[number_sign - 2] = number_num result.remove(result[number_sign - 1]) result.remove(result[number_sign - 1]) result.remove(result[number_sign - 1]) result.remove(result[number_sign - 1]) else: if '*' in result: number_sign = result.index('*') # print(result) number_num = int( float(result[number_sign - 1]) * float(result[number_sign + 1])) result[number_sign] = number_num result.remove(result[number_sign - 1]) result.remove(result[number_sign]) # print('*'+str(result)) elif '÷' in result: number_sign = result.index('÷') if result[number_sign + 1] == 0 or result[number_sign + 1] == '0': create_formula(flag_num) else: # print(result[number_sign - 1],result[number_sign + 1]) number_num = Fraction( int(result[number_sign - 1]), int(result[number_sign + 1])) # print(number_num) result[number_sign] = number_num result.remove(result[number_sign - 1]) result.remove(result[number_sign]) # print('÷'+str(result)) elif '+' in result: number_sign = result.index('+') number_num = int( float(result[number_sign - 1]) + float(result[number_sign + 1])) result[number_sign - 1] = number_num result.remove(result[number_sign]) result.remove(result[number_sign]) # print('+'+str(result)) elif '-' in result: number_sign = result.index('-') number_num = int( float(result[number_sign - 1]) - float(result[number_sign + 1])) result[number_sign - 1] = number_num result.remove(result[number_sign]) result.remove(result[number_sign]) # print('-'+str(result)) result = str(result).replace('[', '').replace(']', '') # print('------------') # print(result) # print('+++++++++++++') if 'Fraction' in result: start = result.index('(') center = result.index(',') end = result.index(')') if result[start + 1] == 0 or result[start + 1] == '0': result = 0 else: result = str(result)[start+1:center] + \ '/' + str(result)[center+1:end] # print(result) # print(start,center,end) # print(formula) return result, formula