题目20:算出100!的各位之和
本帖最后由 欧拉计划 于 2023-8-10 01:45 编辑Factorial digit sum
n! means n × (n - 1) × ... × 3 × 2 × 1
For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800,
and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.
Find the sum of the digits in the number 100!
题目:
n! = n × (n - 1) × ... × 3 × 2 × 1
例如, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800,
那么 10! 的各位之和就是 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.
算出 100! 的各位之和。
def factorial(n):
if n == 0:
return 1
return n*factorial(n-1)
l = (int(item) for item in str(factorial(100)))
print(sum(l)) m = 1
y = 0
for i in range(1,101):
m *= i
string = str(m)
for a in string:
x = int(a)
y += x
print(y)
---------
最后 y =26478
不知道对不对,刚刚学python
def g(xx):
if xx==1:
return 1
else:
return xx*g(xx-1)
def f(x):
if x//10==0:
return x
else:
return x%10+f(x//10)
temp=int(input('输入数字:'))
y=f(g(temp))
print(y)
648 本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:31 编辑
def mul(n):
if n<=0:
print('输入错误')
return -1
else:
result=n
for i in range(1,n):
result*=i
if i==n-1:
a=str(result)
b=list(a)
Sum=0
for j in range(0,len(b)):
Sum+=int(b)
if j==len(b)-1:
print(Sum) total = 1
result = 0
for each in range(1,101):
total *= each
for i in str(total):
result += int(i)
print(result)
结果648 n = 1
for i in range(1,101):
n = n*i
value = sum(int(i) for i in str(n)) EggyBruch 发表于 2016-5-2 09:04
m = 1
y = 0
for i in range(1,101):
你的缩进有错误,应该是:
m = 1
y = 0
for i in range(1,101):
m *= i
string = str(m)
for a in string:
x = int(a)
y += x
print (y)
结果648 from functools import reduce
def euler(x):
factorial = reduce(lambda x,y:x*y,)
return eval('+'.join(list(str(factorial))))
if __name__ == '__main__':
print(euler(100)) 本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:32 编辑
num = 100
count = 1
while num:
count *= num
num -= 1
print count
print sum(int(i) for i in str(count))
648 # encoding:utf-8
from math import factorial
from time import time
def euler020(N):
return sum(int(n) for n in str(factorial(N)))
if __name__ == '__main__':
start = time()
print(euler020(100))
print('cost %.6f sec' % (time() - start)) 此代码使用matlab编程
Problem20所用时间为0.95332秒
Problem20的答案为648
%题目20:算出100!的各位之和
function Output=Problem20(Input)
tic
if nargin==0
Input=100;
end
Factorial=1;%阶乘数
for ii=2:Input
Temp=Mul(Factorial,ii);
Factorial=Temp;
end
toc
Output=sum(Factorial);
disp('此代码使用matlab编程')
disp(['Problem20所用时间为',num2str(toc),'秒'])
disp(['Problem20的答案为',num2str(Output)])
end
%% 子函数
%此函数定义矩阵与数的乘法
function Output=Mul(Input,factor)
if nargin==0
Input=;%大数矩阵
factor=88;%数
end
L=length(Input);
Input=Input*factor;
for ii=L:-1:2
if Input(ii)>=10
Str=num2str(Input(ii));
Input(ii-1)=Input(ii-1)+(Input(ii)-str2double(Str(end)))/10;
Input(ii)=str2double(Str(end));
end
end
if Input(1)>=10
Front=str2num(num2str(Input(1))')';%对第一位进行处理
Output=;
else
Output=Input;
end
end
648
def jiecheng(num):
if num==0 or num==1: return 1
else : return num*jiecheng(num-1)
jiecheng100=str(jiecheng(100))
print(sum())
# 递归
def n_jie(n):
if n == 1 :
return 1
else:
return n * n_jie(n - 1)
num = sum()
print(num)
我用递归试了一下 def Factorial(n):
if n==1:
return 1
else:return n*Factorial(n-1)
list_s=[]
for i in str(Factorial(100)):
list_s.append(int(i))
print(sum(list_s))
>>>
648 结果:648
代码:
sum()
本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:32 编辑
def g(x):
s= str(x)
s = s.strip('0')
return int(s)
s = 1
for i in range(100,0,-1):
s = (g(s*i))
sumi = 0
for j in str(s):
sumi+=int(j)
print(sumi)
import math
a=str(math.factorial(100))
print(sum(list(map(int,a)))) 本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:32 编辑
648
0.00010005312254468692秒
import functools
import time
def get_N(n):
return str(functools.reduce(lambda x, y: x*y, range(1, n+1)))
c = time.clock()
print(sum(map(int, get_N(100))))
print("{}秒".format(time.clock()-c)) #如有错误请指正
def num_sum(x): #创建一个函数,接受一个数值表示最大的阶乘数
init_sum = 1 #声明一个变量用于计算阶乘
list_sum = 0 #声明一个变量用于处理阶乘结果每位的和
for a in range(1,x+1): #使用for语句循环计算阶乘的值
init_sum *= a
temp_1 = str(init_sum) #注意阶乘的值是整数int,这里将int-->str字符串
temp_1 = list(temp_1)#再将字符串转换为列表,这里是注意字符串≠字符串列表
for temp_2 in temp_1:#再次循环,首先将字符串列表中的单个字符串转换为int
list_sum += int(temp_2)#转换为整形的数值累加,也可以先整体转换为整形列表
return print(list_sum) #转换为整形列表后使用sum函数求和也行
num_sum(100)
'''代码有些长,逻辑上个人认为比较清楚,最后的和是648'''
还可以使用递归,但是相较迭代,递归占用资源较多,还有可能超过压栈的极限值。
页:
[1]
2