编辑代码

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()