求 1! + 2! + 3! + … + 202320232023! ,总和的末尾九位数字。
Python 官网:https://www.python.org/
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
本文质量分:
CSDN质量分查询入口:http://www.csdn.net/qc
令 S = 1!+ 2! + 3! + … + 202320232023! ,求 S 的末尾 9 位数字。
(问题来源于 CSDN 问答社区提问“问题”)。
def factorail(n):
if n in (0, 1):
return 1
result = 1
for i in range(2, n+1):
result *= i
return result
start_sec = time()
n = 202320232023
result = 0
for i in range(1, n + 1):
print(' '*50, end='\r')
print(f"{' '*(i%40)}正在计算……", end='\r')
result += factorail(i)
print(f"\n{str(result)[-9:]}\n\n{f' 程序用时 {time() - start_sec:.4f} 秒 ':~^45}\n")
大神解题思路:
阶乘增加很快,45! 的末九位数就全都为 0 了(当然是 Pythond 打印看到的),因为我们只需要末九位数字,所以后面任意的 + n! 都不会对 1! + 2! + … + 202320232023! 的总和最后九位数字造成影响,枚举到 + 45! 即可。答案为 420940313 。
if __name__ == '__main__':
for i in range(1, 4):
print(factorail(i))
input()
/sdcard/qpython $ python 000.py
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
2432902008176640000
51090942171709440000
1124000727777607680000
25852016738884976640000
620448401733239439360000
15511210043330985984000000
403291461126605635584000000
10888869450418352160768000000
304888344611713860501504000000
8841761993739701954543616000000
265252859812191058636308480000000
8222838654177922817725562880000000
263130836933693530167218012160000000
8683317618811886495518194401280000000
295232799039604140847618609643520000000
10333147966386144929666651337523200000000
371993326789901217467999448150835200000000
13763753091226345046315979581580902400000000
523022617466601111760007224100074291200000000
20397882081197443358640281739902897356800000000
815915283247897734345611269596115894272000000000
33452526613163807108170062053440751665152000000000
1405006117752879898543142606244511569936384000000000
60415263063373835637355132068513997507264512000000000
2658271574788448768043625811014615890319638528000000000
119622220865480194561963161495657715064383733760000000000
start_sec = time()
n = 202320232023
result = 0
for i in range(1, 46):
print(' '*50, end='\r')
print(f"{' '*(i%40)}正在计算……", end='\r')
temp = factorail(i)
'''if str(temp)[-9:] == '0'*9:
break'''
result += temp
#print(i, str(result)[-9:], factorail(i))
if __name__ == '__main__':
print(f"\n{str(result)[-9:]}\n\n{f' 程序用时 {time() - start_sec:.4f} 秒 ':~^45}\n")
据其上思路,我们就把 for 循环定到 45 就好。但,这是在您熟悉 1~45 阶乘的情况下,要是不明白这“技巧”哩?
# 总和后九位数字连续十次不变
start_sec = time()
n = 202320232023
result = flag = 0
tail = None
for i in range(1, n + 1):
print(' '*50, end='\r')
print(f"{' '*(i%40)}正在计算……", end='\r')
result += factorail(i)
temp = str(result)[-9:]
if tail != temp:
tail = temp
else:
flag += 1
if flag > 10:
break
#print(i, str(result)[-9:], factorail(i))
if __name__ == '__main__':
print(f"\n{str(result)[-9:]}\n\n{f' 程序用时 {time() - start_sec:.4f} 秒 ':~^45}\n")
start_sec = time()
n = 202320232023
result = 0
for i in range(1, n + 1):
print(' '*50, end='\r')
print(f"{' '*(i%40)}正在计算……", end='\r')
temp = factorail(i)
if str(temp)[-9:] == '0'*9:
break
result += temp
#print(i, str(result)[-9:], factorail(i))
if __name__ == '__main__':
print(f"\n{str(result)[-9:]}\n\n{f' 程序用时 {time() - start_sec:.4f} 秒 ':~^45}\n")
此题目不是考查我等只晓得哈哈写代码的人,而是要求有很好的洞察力和分析力,可以看透事物本质的能力。实实在在循环202320232023次,是行没通滴。
(源码较长,点此跳过源码)
#!/sur/bin/nve python
# coding: utf-8
from time import time
def factorail(n):
if n in (0, 1):
return 1
result = 1
for i in range(2, n+1):
result *= i
return result
#if __name__ == '__main__':
#for i in range(1, 45):
#print(factorail(i))
#input()
# 总和后九位数字连续十次不变
start_sec = time()
n = 202320232023
result = flag = 0
tail = None
for i in range(1, n + 1):
print(' '*50, end='\r')
print(f"{' '*(i%40)}正在计算……", end='\r')
result += factorail(i)
temp = str(result)[-9:]
if tail != temp:
tail = temp
else:
flag += 1
if flag > 10:
break
#print(i, str(result)[-9:], factorail(i))
if __name__ == '__main__':
print(f"\n{str(result)[-9:]}\n\n{f' 程序用时 {time() - start_sec:.4f} 秒 ':~^45}\n")
input(flag)
# n! 后九位数字全0
start_sec = time()
n = 202320232023
result = 0
for i in range(1, n + 1):
print(' '*50, end='\r')
print(f"{' '*(i%40)}正在计算……", end='\r')
temp = factorail(i)
if str(temp)[-9:] == '0'*9:
break
result += temp
#print(i, str(result)[-9:], factorail(i))
if __name__ == '__main__':
print(f"\n{str(result)[-9:]}\n\n{f' 程序用时 {time() - start_sec:.4f} 秒 ':~^45}\n")
input(000000000)
我的HOT博:
本次共计收集 209 篇博文笔记信息,总阅读量 32.76w,平均阅读量 1567。已生成 21 篇阅读量不小于 3000 的博文笔记索引链接。数据采集于 2023-05-02 05:31:52 完成,用时 4 分 36.44 秒。
精品文章:
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
CSDN实用技巧博文: