作品展示:
背景需求
棋盘麦粒的每个棋盘格子里有多少麦粒呢?64格一共需要多少麦粒
用Python写一个答案吧
'''
项目:棋盘麦粒The grain problem 2的次方 sum()
作者:阿夏
时间:2024年1月13日19:03'''
'''在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相:西萨·班·达依尔。
国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,
在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。
请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!
”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,
国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。
那么,宰相要求得到的麦粒到底有多少呢?总数为:
1 + 2 + 4+ 8 + ……… + 2的63次方 = 2的64次方-1 = 18446744073709551615(粒)
人们估计,全世界需要500年生产这么多麦子!'''
print('第1步:计算棋盘麦粒总数和每格子数量')
P=[]
a=0
for i in range(0,64):
a=2**i # 第1个格子是1粒子==2的0次方=1 ……# 第64个格子是1粒子==2的63次方=9223372036854775808
P.append(a) # 把第一个字的1粒计入列表
print(len(P),'个棋盘格的麦粒总数',sum(P))
# 64 个棋盘格的麦粒总数 18446744073709551615
print('每个棋盘格的麦粒数',P)
# 每个棋盘格的麦粒数 [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]
# 8个8个一组
b=[]
for pl in range(int(len(P)/8)):
b.append(P[pl*8:pl*8+8])
for c in range(len(b)):
print('棋盘第',c+1,'行:',b[c])
# 棋盘第 1 行: [1, 2, 4, 8, 16, 32, 64, 128]
# 棋盘第 2 行: [256, 512, 1024, 2048, 4096, 8192, 16384, 32768]
# 棋盘第 3 行: [65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608]
# 棋盘第 4 行: [16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648]
# 棋盘第 5 行: [4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888]
# 棋盘第 6 行: [1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328]
# 棋盘第 7 行: [281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968]
# 棋盘第 8 行: [720575940379279
答案一:64 个棋盘格的麦粒总数 18446744073709551615(京兆亿)
答案二:计算每个格子填写的数量
棋盘第 1 行: [1, 2, 4, 8, 16, 32, 64, 128]
棋盘第 2 行: [256, 512, 1024, 2048, 4096, 8192, 16384, 32768]
棋盘第 3 行: [65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608]
棋盘第 4 行: [16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648]
棋盘第 5 行: [4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888]
棋盘第 6 行: [1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328]
棋盘第 7 行: [281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968]
棋盘第 8 行: [72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]
我想在8*8国际象棋棋盘格里填满64个数字
制作一个word模板
1.0版本---白背景黑字
'''
项目:1.0 白底 黑字 棋盘麦粒The grain problem 2的次方 sum()
作者:阿夏
时间:2024年1月13日19:03'''
'''在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相:西萨·班·达依尔。
国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,
在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。
请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!
”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,
国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。
那么,宰相要求得到的麦粒到底有多少呢?总数为:
1 + 2 + 4+ 8 + ……… + 2的63次方 = 2的64次方-1 = 18446744073709551615(粒)
人们估计,全世界需要500年生产这么多麦子!'''
import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time
import docx
from docx import Document
from docx.shared import Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
print('第1步:计算棋盘麦粒总数和每格子数量')
P=[]
a=0
for i in range(0,64):
a=2**i # 第1个格子是1粒子==2的0次方=1 ……# 第64个格子是1粒子==2的63次方=9223372036854775808
P.append(a) # 把第一个字的1粒计入列表
print(len(P),'个棋盘格的麦粒总数',sum(P))
# 64 个棋盘格的麦粒总数 18446744073709551615
print('每个棋盘格的麦粒数',P)
# 每个棋盘格的麦粒数 [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]
# 8个8个一组
b=[]
for pl in range(int(len(P)/8)):
b.append(P[pl*8:pl*8+8])
for c in range(len(b)):
print('棋盘第',c+1,'行:',b[c])
# 棋盘第 1 行: [1, 2, 4, 8, 16, 32, 64, 128]
# 棋盘第 2 行: [256, 512, 1024, 2048, 4096, 8192, 16384, 32768]
# 棋盘第 3 行: [65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608]
# 棋盘第 4 行: [16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648]
# 棋盘第 5 行: [4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888]
# 棋盘第 6 行: [1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328]
# 棋盘第 7 行: [281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968]
# 棋盘第 8 行: [72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]
# 最前面加上总数,作为标题插入0000单元格
P.insert(0,sum(P))
print(P)
print('第2步:制作单元格坐标')
bg=[]
title='0000'
bg.append(title)
for x in range(1,9):
for y in range(0,8):
bg.append('{}{}'.format('%02d'%x,'%02d'%y))
print(bg)
# ['0000', '0100', '0101', '0102', '0103', '0104', '0105', '0106', '0107', '0200', '0201', '0202', '0203', '0204', '0205', '0206', '0207', '0300', '0301', '0302', '0303', '0304', '0305', '0306', '0307', '0400', '0401', '0402', '0403', '0404', '0405', '0406', '0407', '0500', '0501', '0502', '0503', '0504', '0505', '0506', '0507', '0600', '0601', '0602', '0603', '0604', '0605', '0606', '0607', '0700', '0701', '0702', '0703', '0704', '0705', '0706', '0707', '0800', '0801', '0802', '0803', '0804', '0805', '0806', '0807']
print('第3步:写入Word棋盘')
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\棋盘麦粒\棋盘麦粒.docx')
# # 房间模板(第一个表格)要写入的门牌号列表
table = doc.tables[0] # 表0,表2 写标题用的
# 标题写入3、5单元格
for t in range(0,len(bg)): # 0-5是最下面一行,用来写卡片数字
pp=int(bg[t][0:2]) #
qq=int(bg[t][2:4])
k=str(P[t]) # 提取list图案列表里面每个图形 t=索引数字
print(pp,qq,k)
# 图案符号的字体、大小参数
run=table.cell(pp,qq).paragraphs[0].add_run(k) # 在单元格0,0(第1行第1列)输入第0个图图案
run.font.name = '黑体'#输入时默认华文彩云字体
# run.font.size = Pt(46) #输入字体大小默认30号 换行(一页一份大卡片
run.font.size = Pt(22) #是否加粗
# run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
run.font.color.rgb = RGBColor(0,0,0) #数字小,颜色深0-255
run.bold=True
# paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
#
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\棋盘麦粒\棋盘麦粒(填写版).docx')#保存为XX学号的电话号码word
time.sleep(2)
问题:
1、字号太大,撑大了方形格子,但是缩小字号容易看不清楚,还是保持黑体22,加粗
2、国际象棋棋盘是黑白格子,做一个黑白底的模板,但是那样就要有黑和白两种字体
2.0代码——黑白棋盘格及数字填充
word 单元格用黑色填充
'''
项目:2.0 黑白棋盘 棋盘麦粒The grain problem 2的次方 sum()
重点:填充黑白背景,黑棋盘用白文字,白棋盘用黑文字
作者:阿夏
时间:2024年1月13日19:03'''
'''在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相:西萨·班·达依尔。
国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,
在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。
请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!
”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,
国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。
那么,宰相要求得到的麦粒到底有多少呢?总数为:
1 + 2 + 4+ 8 + ……… + 2的63次方 = 2的64次方-1 = 18446744073709551615(粒)
人们估计,全世界需要500年生产这么多麦子!'''
import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time
import docx
from docx import Document
from docx.shared import Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
print('第1步:制作单元格坐标,分别提取')
# 所有单元格坐标
bg=[]
# title='0000'
# bg.append(title)
for x in range(1,9):
for y in range(0,8):
bg.append('{}{}'.format('%02d'%x,'%02d'%y))
print(len(bg))
# ['0000', '0100', '0101', '0102', '0103', '0104', '0105', '0106', '0107', '0200', '0201', '0202', '0203', '0204', '0205', '0206', '0207', '0300', '0301', '0302', '0303', '0304', '0305', '0306', '0307', '0400', '0401', '0402', '0403', '0404', '0405', '0406', '0407', '0500', '0501', '0502', '0503', '0504', '0505', '0506', '0507', '0600', '0601', '0602', '0603', '0604', '0605', '0606', '0607', '0700', '0701', '0702', '0703', '0704', '0705', '0706', '0707', '0800', '0801', '0802', '0803', '0804', '0805', '0806', '0807']
# 为了黑白格子,把所有黑格子坐标写出类,记录索引数字
bg_black=[]
bg_white=[]
BG=[]
# 提取黑色的第一部分 1,3,5,7行的
for a1 in range(1,9,2):
for b1 in range(0,8,2):
bg_black.append('{}{}'.format('%02d'%a1,'%02d'%b1))
for a2 in range(2,9,2):
for b2 in range(1,8,2):
bg_black.append('{}{}'.format('%02d'%a2,'%02d'%b2))
print(bg_black)
BG.append(bg_black)
# 提取白色的第一部分
for a4 in range(1,9,2):
for b4 in range(1,8,2):
bg_white.append('{}{}'.format('%02d'%a4,'%02d'%b4))
for a3 in range(2,9,2):
for b3 in range(0,8,2):
bg_white.append('{}{}'.format('%02d'%a3,'%02d'%b3))
print(bg_white)
# 加上标题
title='0000'
bg_white.insert(0,title)
BG.append(bg_white)
print('第1步:计算棋盘麦粒总数和每格子数量')
P=[]
Q=[]
a=0
for i in range(0,64):
a=2**i # 第1个格子是1粒子==2的0次方=1 ……# 第64个格子是1粒子==2的63次方=9223372036854775808
P.append(str(a)) # [''.''.'']
print(P )
Q.append(a) # 算总数用
print(len(P),'个棋盘格的麦粒总数',sum(Q))
# # 64 个棋盘格的麦粒总数 18446744073709551615
# print('每个棋盘格的麦粒数',str(P))
# # 每个棋盘格的麦粒数 [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]
# 8个8个一组
# b=[]
# for pl in range(int(len(P)/8)):
# b.append(P[pl*8:pl*8+8])
# for c in range(len(b)):
# print('棋盘第',c+1,'行:',b[c])
# 棋盘第 1 行: [1, 2, 4, 8, 16, 32, 64, 128]
# 棋盘第 2 行: [256, 512, 1024, 2048, 4096, 8192, 16384, 32768]
# 棋盘第 3 行: [65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608]
# 棋盘第 4 行: [16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648]
# 棋盘第 5 行: [4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888]
# 棋盘第 6 行: [1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328]
# 棋盘第 7 行: [281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968]
# 棋盘第 8 行: [72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]
# # # 最前面加上总数,作为标题插入0000单元格
# # # P.insert(0,sum(P))
# # print(P)
# # print(len(P))
# # # 65
# # 为了黑白格子,把所有黑格子的数字写出类,通过单元格索引判断记录索引数字
# 提取黑格子中的需要填写的数字,写成白数字 白数字与黑格子匹配
PP=[]
p_white=[]
for g1 in range(len(bg_black)):
for h1 in range(len(bg)):
if bg_black[g1]==bg[h1]:
p_white.append(P[h1])
else:
pass
print(p_white)
#需要变成白色字体的数字 ['1', '4', '16', '64', '512', '2048', '8192', '32768', '65536', '262144', '1048576', '4194304', '33554432', '134217728', '536870912', '2147483648', '4294967296', '17179869184', '68719476736', '274877906944', '2199023255552', '8796093022208', '35184372088832', '140737488355328', '281474976710656', '1125899906842624', '4503599627370496', '18014398509481984', '144115188075855872', '576460752303423488', '2305843009213693952', '9223372036854775808']
print(len(p_white)) # 32
PP.append(p_white)
# 提取白格子中的需要填写的数字,写成黑数字 黑数字与白格子匹配
p_black=[]
for g2 in range(len(bg_white)):
for h2 in range(len(bg)):
if bg_white[g2]==bg[h2]:
p_black.append(P[h2])
else:
pass
print(p_black)
# 黑色字体最前面加上 总数,作为标题
p_black.insert(0,sum(Q))
#需要变成白色字体的数字['2', '8', '32', '128', '256', '1024', '4096', '16384', '131072', '524288', '2097152', '8388608', '16777216', '67108864', '268435456', '1073741824', '8589934592', '34359738368', '137438953472', '549755813888', '1099511627776', '4398046511104', '17592186044416', '70368744177664', '562949953421312', '2251799813685248', '9007199254740992', '36028797018963968', '72057594037927936', '288230376151711744', '1152921504606846976', '4611686018427387904']
print(len(p_black)) # 32
PP.append(p_black)
print(PP)
print(BG)
print('第3步:写入Word棋盘')
# RGB 颜色,0,0,0=黑色,255,255,255=白色
one=[255,0]
two=[255,0]
three=[255,0]
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\棋盘麦粒\棋盘麦粒.docx')
# # 房间模板(第一个表格)要写入的门牌号列表
for w in range(len(BG)):
table = doc.tables[0] # 表0,表2 写标题用的
for t in range(0,len(BG[w])): # 0-5是最下面一行,用来写卡片数字
pp=int(BG[w][t][0:2]) #
qq=int(BG[w][t][2:4])
k=str(PP[w][t]) # 提取list图案列表里面每个图形 t=索引数字
print(pp,qq,k)
# 图案符号的字体、大小参数
run=table.cell(pp,qq).paragraphs[0].add_run(k) # 在单元格0,0(第1行第1列)输入第0个图图案
run.font.name = '黑体'#输入时默认华文彩云字体
# run.font.size = Pt(46) #输入字体大小默认30号 换行(一页一份大卡片
run.font.size = Pt(22) #是否加粗
# run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
run.font.color.rgb = RGBColor(one[w],two[w],three[w]) #数字小,颜色深0-255
run.bold=True
# paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
#
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\棋盘麦粒\棋盘麦粒(填写版).docx')#保存为XX学号的电话号码word
time.sleep(2)