题目:

  小学老师要每周给同学出300道四则运算练习题。

  要求:

  1、两个运算符,100内数字

  2、打印方式为,不需要写出答案,或者需要写出答案,并且保证答案在0...100之间

  更多细节:

  1、是否有乘除法,是否有括号,数值范围,加减有无负数

  2、除法有无余数,是否支持分数,打印中每行的间距可调整

实现:

  1、根据给定的数值范围,随机生成3个运算数。

  2、先判断是否需要乘除法,在符号列表中随机选取“加减乘除”符号。

  3、判断是否需要括号,若需要括号,则生成有效括号:同级运算在前一项加括号,非同级运算在低级运算加括号。

  4、生成算式后,根据运算顺序判断,减法与除法是否符合要求。保证加减无负数,只需保证所有减法都无负数出现即可。

  5、判断计算结果是否在0到100之间。

  6、若上述要求都符合,则生成的算式符合要求。

  7、将生成的算式,按照要求输出。

  

Python生成随机加减法 python随机生成加减乘除_Python生成随机加减法

Python生成随机加减法 python随机生成加减乘除_整除_02

1 import random
  2 import re
  3 # is_mul表示是否有乘除法,0表示无(加减法),1表示有乘除法
  4 is_mul = 1
  5 # is_brackets表示是否有括号,0表示无,1表示有括号
  6 is_brackets = 1
  7 # num_min表示随机数的最小值,num_max表示随机数的最大值
  8 num_min = 0
  9 num_max = 100
 10 # is_positive表示结果(包括中间计算过程)是否是正数,0表示可以不为正数,1表示结果为正数,默认为1结果为正数
 11 is_positive = 1
 12 # is_divide表示是否是整除,0表示可以不为整除,1表示是整除,默认为整除
 13 is_divide = 1
 14 # list_sign符号列表
 15 list_sigh = ['+', '-', '*', '/']
 16 # 所需算式的数量,默认为100
 17 amount = 5
 18 # 是否保证结果在100以内,0表示不需在100以内,1表示结果保证在100以内
 19 is_within = 0
 20 # 打印方式,0表示只打印题目,1表示打印题目加答案
 21 print_type = 0
 22 # 一行打印几道题
 23 print_num = 3
 24 
 25 
 26 # 添加括号函数,当在第二项添加括号时,返回值为2
 27 def add_brackets(num1, num2, num3, sign1, sign2):
 28     # print(str(num1)+list_sigh[sign1]+str(num2)+list_sigh[sign2]+str(num3))
 29     # 如果都为加减法
 30     if (sign1 < 2 and sign2 < 2) or (sign1 > 2 and sign2 > 2):
 31         # print("同号")
 32         s = str(num1)+list_sigh[sign1]+'('+str(num2)+list_sigh[sign2]+str(num3)+')'
 33     else:
 34         # print("异号")
 35         # 异号时在+-时加括号
 36         if sign1 < 2:
 37             s = '('+str(num1)+list_sigh[sign1]+str(num2)+')'+list_sigh[sign2]+str(num3)
 38         else:
 39             s = str(num1)+list_sigh[sign1]+'('+str(num2)+list_sigh[sign2]+str(num3)+')'
 40     return s
 41 
 42 
 43 # 判断减法
 44 def judge_subtraction(num1, num2):
 45     if is_positive == 0:  # 当结果可以为负数时,不需要判断直接返回True
 46         return True
 47     else:
 48         r = num1 - num2
 49         if r < 0:
 50             # print('减法出现负数')
 51             return False
 52         else:
 53             # print('减法为正数')
 54             return True
 55 
 56 
 57 # 判断除法
 58 def judge_division(num1, num2):
 59     if num2 == 0:
 60         # print('除数为0')
 61         return False
 62     if is_divide == 0:  # 表示除法可以不为整除,直接返回True
 63         return True
 64     else:
 65         r = num1 % num2
 66         if r == 0:
 67             # print('整除')
 68             return True
 69         else:
 70             # print('有余数')
 71             return False
 72 
 73 
 74 # 含单个运算符的运算
 75 def calculate_single(num1, num2, sign):
 76     if sign == '-':
 77         return judge_subtraction(num1, num2)
 78     elif sign == '/':
 79         return judge_division(num1, num2)
 80     else:
 81         return True
 82 
 83 
 84 # 按顺序从前向后算
 85 def calculate_order(num_list, sign_list):
 86     if calculate_single(num_list[0], num_list[1], sign_list[0]):
 87 
 88         t = eval(str(num_list[0]) + sign_list[0] + str(num_list[1]))
 89         if calculate_single(t, num_list[2], sign_list[1]):
 90             return True
 91         else:
 92             return False
 93     else:
 94         return False
 95 
 96 
 97 # 先算后项,在算前项
 98 def calculate_exchange(num_list, sign_list):
 99     if calculate_single(num_list[1], num_list[2], sign_list[1]):
100         t = eval(str(num_list[1]) + sign_list[1] + str(num_list[2]))
101         # print(t)
102         if calculate_single(num_list[0], t, sign_list[0]):
103             return True
104         else:
105             return False
106     else:
107         return False
108 
109 
110 # 判断生成的算式是否符合要求
111 def judge_function(ss):
112     # 提取算式中的数字
113     num_list = re.findall(r'\d+', ss)
114     num_list = [int(x) for x in num_list]
115     # 提取算式中的+-*/符号
116     sign_list = re.findall(r"[\-\*\+\/]", ss)
117     if is_positive == 0 and is_divide == 0:
118         # 当结果可以不为正数,除法可以不为整除时,直接返回true
119         return True
120     else:
121         # 当需要判断时,进行判断,先判断是否含有减法以及除法,再根据计算顺序进行判断
122         if (ss.find('-') == -1) and (ss.find('/') == -1):
123             # 算式中不包含除法和减法时,直接返回true
124             # print('不需判断')
125             return True
126         else:
127             # 当要进行减法,除法判断时,分带不带括号,以及运算级来判断先算前项还是先算后项
128             # print('需判断')
129             if ss.endswith(')'):
130                 # print('括号在后')
131                 return calculate_exchange(num_list, sign_list)
132             elif ss.startswith('('):
133                 # print('括号在前')
134                 return calculate_order(num_list, sign_list)
135             elif (sign_list[0] == '-' or sign_list[0] == '+') and (sign_list[1] == '*' or sign_list[1] == '/'):
136                 # print('先计算二')
137                 return calculate_exchange(num_list, sign_list)
138             else:
139                 # print('先计算一')
140                 return calculate_order(num_list, sign_list)
141 
142 
143 # 打印输出函数
144 def print_function(question_list, answer_list):
145     if print_type == 0:
146         for i in range(amount):
147             print(question_list[i], end="      ")
148             if (i + 1) % print_num == 0:
149                 print('\n')
150     else:
151         for i in range(amount):
152             print(question_list[i], "=", answer_list[i], end="      ")
153             if (i + 1) % print_num == 0:
154                 print('\n')
155 
156 
157 # num1,num2,num3表示生成的三个随机数
158 def main():
159     i = 0
160     question_list = []
161     answer_list = []
162     global is_mul, is_brackets, num_min, num_max, is_positive, is_divide, amount, is_within, print_type, print_num
163     is_mul = int(input("是否需要乘除法?0表示不需要,1表示需要:"))
164     is_brackets = int(input("是否需要括号?0表示不需要,1表示有括号:"))
165     num_min = int(input("请输入运算数的最小值:"))
166     num_max = int(input("请输入运算数的最大值:"))
167     amount = int(input("请输入需要运算式的数量:"))
168     is_within = int(input("结果是否需要保证在100以内?0表示不需要,1表示需要:"))
169     is_positive = int(input("结果(包括中间运算结果)是否都>=0?0表示可以为负数,1表示都为>=0:"))
170     is_divide = int(input("是否都为整除?0表示可以不为整除,1表示都为整除:"))
171     print_type = int(input("打印方式?0表示只打印题目,1表示打印题目和结果:"))
172     print_num = int(input("一行打印几道题?"))
173 
174     while i < amount:
175         num1 = random.randint(num_min, num_max)
176         num2 = random.randint(num_min, num_max)
177         num3 = random.randint(num_min, num_max)
178         # 判断是否有乘除法,无乘除法在list_sign下标0-2中选择,有乘除法在list_sign下标0-3之间选
179         if is_mul == 0:
180             sign1 = random.randint(0, 1)
181             sign2 = random.randint(0, 1)
182         else:
183             sign1 = random.randint(0, 3)
184             sign2 = random.randint(0, 3)
185         # print(list_sigh[sign1],list[sign2])
186         # 判断是否加括号:条件is_brackets为1表示有括号,1/3的概率随机生成括号
187         if is_brackets == 1 and (random.randint(0, 3) % 3) == 0:
188             str_form = add_brackets(num1, num2, num3, sign1, sign2)
189         else:
190             str_form = str(num1)+list_sigh[sign1]+str(num2)+list_sigh[sign2]+str(num3)
191         # print(str_form)
192         # print(judge_function(str_form))
193         if judge_function(str_form):
194             result = eval(str_form)
195             # 当需要保证结果在100以内且结果在0-100以内,或者不需结果在100以内时,将结果加入列表中
196             if (is_within == 1 and 100 >= result >= 0) or is_within == 0:
197                 question_list.append(str_form)
198                 answer_list.append(result)
199                 i = i+1
200     print_function(question_list, answer_list)
201 
202 
203 if __name__ == '__main__':
204     main()

View Code

 

运行结果:

              

Python生成随机加减法 python随机生成加减乘除_Python生成随机加减法_03

        

              

Python生成随机加减法 python随机生成加减乘除_ide_04

 

              

Python生成随机加减法 python随机生成加减乘除_随机数_05