import random
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
def generate_valid_addition(current):
c_ten = current // 10
c_ge = current % 10
max_ten = 9 - c_ten
if max_ten < 1:
return None
next_ten = random.randint(1, max_ten)
max_ge = 9 - c_ge
if max_ge < 0:
return None
next_ge = random.randint(0, max_ge)
return next_ten * 10 + next_ge
def generate_valid_subtraction(current):
c_ten = current // 10
c_ge = current % 10
if current < 10:
return None
min_result = 10
max_sub = current - min_result
if max_sub < 10:
return None
max_ten = min(c_ten, max_sub // 10)
if max_ten < 1:
return None
next_ten = random.randint(1, max_ten)
max_ge = c_ge
next_ge = random.randint(0, max_ge)
next_number = next_ten * 10 + next_ge
if current - next_number < 10:
return None
return next_number
def generate_question():
while True:
try:
numbers = []
operators = []
current = random.randint(10, 99)
numbers.append(current)
for _ in range(4):
op = random.choice(['+', '-'])
if op == '+':
next_num = generate_valid_addition(current)
else:
next_num = generate_valid_subtraction(current)
if next_num is None:
raise ValueError
numbers.append(next_num)
operators.append(op)
current = current + next_num if op == '+' else current - next_num
if not (10 <= current <= 99):
raise ValueError
question = f"{numbers[0]}"
for i in range(4):
question += f" {operators[i]} {numbers[i+1]}"
return question
except:
continue
def main():
doc = Document()
doc.styles['Normal'].font.name = '宋体'
doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
doc.styles['Normal'].font.size = Pt(10)
questions = set()
while len(questions) < 1000:
q = generate_question()
if q not in questions:
questions.add(q)
print(f"Generated: {len(questions)}/1000", end='\r')
questions = list(questions)
for i in range(0, 1000, 3):
group = questions[i:i+3]
line = "\t\t".join(group)
doc.add_paragraph(line)
doc.save('加减混合运算题.docx')
print("\n生成完成,文件已保存为:加减混合运算题.docx")
if __name__ == "__main__":
main()