家庭口算比赛🥳

我发现最近这几天我们一家三口都没怎么在一起干一件事情,这可不是什么好现象,于是我们商讨了一下,最终决定开起第2届家庭口算大赛📝,既锻炼大家的口算能力,又增加我们的亲情。

我使用 AI 生成了一个 Python 脚本,作用是生成随机的双面试卷。我运行程序并且打印好卷子,时间一到我们三人准时开始答题,一时间家里变得安静非常安静,仿佛一根针掉到地下都可以听见。十几分钟过去,爸爸率先宣布答完卷子!随后我也全部答完,撕破喉咙喊出:“我也交卷!”这时候妈妈刚答到第二面。片刻后妈妈还没写完,由于晚上时间紧迫,我们提前开启了对答案环节。

我先把我们三人的试卷粘到这里哈:(不小心拍成实况了,现在看起来有点虚,抱歉哈)(顺序:我➡️爸爸➡️妈妈)
pm7Q0Y9.jpg
pm7QBWR.jpg
pm7QrS1.jpg

我们对答案过程也十分热烈🔥,我们争先恐后地报出答案,核对自己的对错,遇到不一样的重新算一遍,也算是加深印象。片刻后我们便对完了题目。

从图中可以看到,我总共做错了 11道题,主要是关于复杂分数/小数的乘除法相关的错误,以及分不清楚符号。爸爸比较全能,几乎没有做错题目,只因为马虎做错了一道题目。而妈妈貌似不太清楚复数相关的概念,整个卷子都是空着的,建议重新复习一下负数相关的知识点,以及负数的加减乘除运算📖。

最终排名结果
🥇爸爸
🥈我
🥉妈妈
第二天,我们给几乎完胜的爸爸颁发了奖杯,以庆祝他的优秀成绩!

这种活动促进了我们三人的亲情,让学习有了趣味,还提升了我们的计算能力,我们以后会经常举行这种比赛的!对了,Python 代码我粘贴在这里,如果有人需要,直接拿走就行了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
import random
from docx import Document
from docx.shared import Pt, Cm, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml


def set_cell_shading(cell, color):
"""设置单元格背景色"""
shading_elm = parse_xml(
f'<w:shd xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" w:fill="{color}"/>'
)
cell._tc.get_or_add_tcPr().append(shading_elm)


def set_cell_border(cell, **kwargs):
"""设置单元格边框"""
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
tcBorders = parse_xml(
f'<w:tcBorders xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" w:val="single" w:sz="0" w:color="auto"/>'
)
tcPr.append(tcBorders)


def add_int_addition_negative():
"""整数加法(含负数)"""
a = random.randint(-20, 20)
b = random.randint(-20, 20)
return f"{a} + ({b}) = "


def add_int_subtraction_negative():
"""整数减法(含负数)"""
a = random.randint(-20, 20)
b = random.randint(-20, 20)
return f"{a} - ({b}) = "


def add_int_multiplication_negative():
"""整数乘法(含负数)"""
a = random.randint(-10, 10)
b = random.randint(-10, 10)
return f"{a} × {b} = "


def add_int_division_negative():
"""整数除法(含负数)"""
while True:
b = random.randint(-10, 10)
if b == 0:
continue
result = random.randint(-10, 10)
a = b * result
if a < -100 or a > 100:
continue
return f"{a} ÷ {b} = "


def add_decimal_addition():
"""小数加法"""
a = round(random.uniform(-10, 10), 2)
b = round(random.uniform(-10, 10), 2)
return f"{a} + {b} = "


def add_decimal_subtraction():
"""小数减法"""
a = round(random.uniform(-10, 10), 2)
b = round(random.uniform(-10, 10), 2)
return f"{a} - {b} = "


def add_decimal_multiplication():
"""小数乘法"""
a = round(random.uniform(-5, 5), 1)
b = round(random.uniform(-5, 5), 1)
return f"{a} × {b} = "


def add_decimal_division():
"""小数除法"""
while True:
b = round(random.uniform(0.1, 5), 1)
result = round(random.uniform(-5, 5), 1)
a = round(b * result, 2)
if a == 0:
continue
return f"{a} ÷ {b} = "


def add_fraction_addition():
"""分数加法"""
denominators = [2, 3, 4, 5, 6, 8, 10]
d1 = random.choice(denominators)
d2 = random.choice(denominators)
n1 = random.randint(1, d1 - 1)
n2 = random.randint(1, d2 - 1)
sign1 = random.choice(['', '-'])
sign2 = random.choice(['', '-'])
return f"{sign1}{n1}/{d1} + {sign2}{n2}/{d2} = "


def add_fraction_subtraction():
"""分数减法"""
denominators = [2, 3, 4, 5, 6, 8, 10]
d1 = random.choice(denominators)
d2 = random.choice(denominators)
n1 = random.randint(1, d1 - 1)
n2 = random.randint(1, d2 - 1)
sign1 = random.choice(['', '-'])
sign2 = random.choice(['', '-'])
return f"{sign1}{n1}/{d1} - {sign2}{n2}/{d2} = "


def add_fraction_multiplication():
"""分数乘法"""
denominators = [2, 3, 4, 5, 6]
d1 = random.choice(denominators)
d2 = random.choice(denominators)
n1 = random.randint(1, d1 - 1)
n2 = random.randint(1, d2 - 1)
sign1 = random.choice(['', '-'])
sign2 = random.choice(['', '-'])
return f"{sign1}{n1}/{d1} × {sign2}{n2}/{d2} = "


def add_fraction_division():
"""分数除法"""
denominators = [2, 3, 4, 5, 6]
d1 = random.choice(denominators)
d2 = random.choice(denominators)
n1 = random.randint(1, d1 - 1)
n2 = random.randint(1, d2 - 1)
sign1 = random.choice(['', '-'])
sign2 = random.choice(['', '-'])
return f"{sign1}{n1}/{d1} ÷ {sign2}{n2}/{d2} = "


def add_negative_number_simple():
"""简单负数计算"""
a = random.randint(-30, 30)
b = random.randint(-30, 30)
op = random.choice(['+', '-'])
if op == '+':
return f"({a}) + ({b}) = "
else:
return f"({a}) - ({b}) = "


def add_negative_abs():
"""绝对值计算"""
a = random.randint(-50, 50)
return f"|{a}| = "


def add_find_x():
"""求未知数x(简单方程)"""
a = random.randint(-10, 10)
result = random.randint(-20, 20)
op = random.choice(['+', '-'])
if op == '+':
return f"x + ({a}) = {result},x = "
else:
return f"x - ({a}) = {result},x = "


def add_power_square():
"""平方计算"""
a = random.randint(-10, 10)
return f"({a})² = "


def generate_problem_set(count=100):
"""生成题目集合"""
generators = [
add_int_addition_negative,
add_int_subtraction_negative,
add_int_multiplication_negative,
add_int_division_negative,
add_decimal_addition,
add_decimal_subtraction,
add_decimal_multiplication,
add_decimal_division,
add_fraction_addition,
add_fraction_subtraction,
add_fraction_multiplication,
add_fraction_division,
add_negative_number_simple,
add_negative_abs,
add_find_x,
add_power_square,
]

problems = []
used = set()
attempts = 0

while len(problems) < count and attempts < count * 50:
gen = random.choice(generators)
problem = gen()
if problem not in used:
used.add(problem)
problems.append(problem)
attempts += 1

return problems


def create_beautiful_paper():
"""创建精美的口算卷子"""
doc = Document()

# 设置页面为横向
section = doc.sections[0]
section.orientation = WD_ORIENT.LANDSCAPE
section.page_width = Cm(29.7)
section.page_height = Cm(21)
section.top_margin = Cm(1.5)
section.bottom_margin = Cm(1.5)
section.left_margin = Cm(1.5)
section.right_margin = Cm(1.5)

# 标题
title_para = doc.add_paragraph()
title_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
title_run = title_para.add_run("六年级口算练习题(含负数)")
title_run.font.size = Pt(22)
title_run.font.bold = True
title_run.font.name = '宋体'
title_run.font.color.rgb = RGBColor(0x1A, 0x3C, 0x6E)

# 副标题装饰线
deco_para = doc.add_paragraph()
deco_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
deco_run = deco_para.add_run("━" * 60)
deco_run.font.size = Pt(10)
deco_run.font.color.rgb = RGBColor(0x4A, 0x90, 0xD9)

# 信息栏
info_para = doc.add_paragraph()
info_para.alignment = WD_ALIGN_PARAGRAPH.CENTER

info_table = doc.add_table(rows=1, cols=3)
info_table.alignment = WD_TABLE_ALIGNMENT.CENTER

cells = info_table.rows[0].cells
labels = [
("姓 名:", ""),
("班 级:", ""),
("得 分:", "")
]

for i, (label, _) in enumerate(labels):
cell = cells[i]
cell.width = Cm(7)
p = cell.paragraphs[0]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run(label)
run.font.size = Pt(14)
run.font.bold = True
run.font.name = '宋体'
run.font.color.rgb = RGBColor(0x33, 0x33, 0x33)
run2 = p.add_run("______")
run2.font.size = Pt(14)
run2.font.name = '宋体'
run2.font.color.rgb = RGBColor(0x66, 0x66, 0x66)

# 说明
note_para = doc.add_paragraph()
note_para.alignment = WD_ALIGN_PARAGRAPH.LEFT
note_run = note_para.add_run("注意:请直接写出得数,不用写出计算过程。 时间:______ 分钟")
note_run.font.size = Pt(11)
note_run.font.name = '宋体'
note_run.font.color.rgb = RGBColor(0x88, 0x88, 0x88)

# 装饰线
deco_para2 = doc.add_paragraph()
deco_para2.alignment = WD_ALIGN_PARAGRAPH.CENTER
deco_run2 = deco_para2.add_run("━" * 60)
deco_run2.font.size = Pt(8)
deco_run2.font.color.rgb = RGBColor(0x4A, 0x90, 0xD9)

# 生成100道题目
problems = generate_problem_set(100)

# 使用表格布局题目 - 4列布局
cols = 4
rows_needed = (len(problems) + cols - 1) // cols

table = doc.add_table(rows=rows_needed, cols=cols)
table.alignment = WD_TABLE_ALIGNMENT.CENTER

# 设置表格样式
tbl = table._tbl
tblPr = tbl.tblPr if tbl.tblPr is not None else parse_xml(
f'<w:tblPr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" w:tblW="0" w:tblType="auto"/>'
)
tblBorders_xml = (
'<w:tblBorders xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">'
'<w:top w:val="single" w:sz="4" w:color="4A90D9"/>'
'<w:left w:val="single" w:sz="4" w:color="4A90D9"/>'
'<w:bottom w:val="single" w:sz="4" w:color="4A90D9"/>'
'<w:right w:val="single" w:sz="4" w:color="4A90D9"/>'
'<w:insideH w:val="single" w:sz="4" w:color="4A90D9"/>'
'<w:insideV w:val="single" w:sz="4" w:color="4A90D9"/>'
'</w:tblBorders>'
)
tblBorders = parse_xml(tblBorders_xml)
tblPr.append(tblBorders)

# 填充题目
for idx, problem in enumerate(problems):
row_idx = idx // cols
col_idx = idx % cols
cell = table.cell(row_idx, col_idx)
cell.width = Cm(6.5)

# 设置单元格背景色(交替)
if row_idx % 2 == 0:
set_cell_shading(cell, "E8F4FD")

# 创建题目段落
p = cell.paragraphs[0]
p.alignment = WD_ALIGN_PARAGRAPH.LEFT
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(6)
p.paragraph_format.left_indent = Cm(0.3)

# 题号
num_run = p.add_run(f"{idx + 1:3d}. ")
num_run.font.size = Pt(12)
num_run.font.bold = True
num_run.font.name = '宋体'
num_run.font.color.rgb = RGBColor(0x1A, 0x3C, 0x6E)

# 题目内容
prob_run = p.add_run(problem)
prob_run.font.size = Pt(12)
prob_run.font.name = '宋体'
prob_run.font.color.rgb = RGBColor(0x33, 0x33, 0x33)

# 底部装饰
bottom_deco = doc.add_paragraph()
bottom_deco.alignment = WD_ALIGN_PARAGRAPH.CENTER
bottom_run = bottom_deco.add_run("━" * 60)
bottom_run.font.size = Pt(8)
bottom_run.font.color.rgb = RGBColor(0x4A, 0x90, 0xD9)

# 保存文档
output_path = "/Users/720coder/Documents/口算/六年级口算题_100道.docx"
doc.save(output_path)
print(f"文档已保存: {output_path}")


if __name__ == "__main__":
random.seed()
create_beautiful_paper()

家庭口算比赛🥳
https://720info.github.io/2026/08/07/家庭口算比赛🥳/
作者
720 科技
发布于
2026年8月7日
许可协议