欧拉计划 发表于 2015-4-23 16:09:39

题目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! 的各位之和。


张无忌 发表于 2016-5-2 05:30:35

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

EggyBruch 发表于 2016-5-2 09:04:23

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

huomqh 发表于 2016-6-14 17:14:54

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

gzt1993828 发表于 2016-8-2 15:34:07

本帖最后由 永恒的蓝色梦想 于 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)

愤怒的大头菇 发表于 2016-8-26 10:18:05

total = 1
result = 0
for each in range(1,101):
      total *= each


for i in str(total):
      result += int(i)

print(result)

结果648

Plusenxue 发表于 2016-8-27 16:03:03

n = 1
for i in range(1,101):
    n = n*i
value = sum(int(i) for i in str(n))

jerryxjr1220 发表于 2016-9-18 17:04:49

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

776667 发表于 2016-10-20 00:15:32

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

376103327 发表于 2016-10-26 17:02:57

本帖最后由 永恒的蓝色梦想 于 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

芒果加黄桃 发表于 2017-1-10 23:07:43

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

渡风 发表于 2017-1-18 17:23:02

此代码使用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


   

NiceB 发表于 2017-3-7 13:48:21

648


def jiecheng(num):
    if num==0 or num==1: return 1
    else : return num*jiecheng(num-1)
jiecheng100=str(jiecheng(100))
print(sum())

marmot 发表于 2017-3-8 23:00:06

# 递归
def n_jie(n):
    if n == 1 :
      return 1
    else:
      return n * n_jie(n - 1)

num = sum()

print(num)

我用递归试了一下

99592938 发表于 2017-3-15 11:29:03

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

凌晨分子 发表于 2017-4-7 00:10:03

结果:648
代码:
sum()

hvagab 发表于 2018-4-22 21:50:24

本帖最后由 永恒的蓝色梦想 于 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)

塔利班 发表于 2018-9-1 11:55:35

import math
a=str(math.factorial(100))
print(sum(list(map(int,a))))

王小召 发表于 2019-6-5 14:42:57

本帖最后由 永恒的蓝色梦想 于 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))

doodu 发表于 2019-6-23 00:30:58

#如有错误请指正

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
查看完整版本: 题目20:算出100!的各位之和