鱼C论坛

 找回密码
 立即注册
查看: 6544|回复: 31

题目20:算出100!的各位之和

[复制链接]
发表于 2015-4-23 16:09:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 欧拉计划 于 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! 的各位之和。


评分

参与人数 1贡献 +1 收起 理由
cwhsmile + 1 有专用数学模块math,答案648,这题简单。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[j])
            if j==len(b)-1:
                print(Sum)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-20 00:15:32 | 显示全部楼层
from functools import reduce

def euler(x):
    factorial = reduce(lambda x,y:x*y,[i for i in range(1,x+1)])
    return eval('+'.join(list(str(factorial))))

if __name__ == '__main__':
    print(euler(100))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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=[1 2];%大数矩阵
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=[Front,Input(2:end)];
else
    Output=Input;
end
end


    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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([int(x) for x in jiecheng100]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 23:00:06 | 显示全部楼层
# 递归
def n_jie(n):
    if n == 1 :
        return 1
    else:
        return n * n_jie(n - 1)

num = sum([int(i) for i in str(n_jie(100))])

print(num)

我用递归试了一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-7 00:10:03 | 显示全部楼层
结果:648
代码:
sum([int(i) for i in str(reduce(lambda x,y:x*y, range(1,101)))])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-1 11:55:35 | 显示全部楼层
import math
a=str(math.factorial(100))
print(sum(list(map(int,a))))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'''

还可以使用递归,但是相较迭代,递归占用资源较多,还有可能超过压栈的极限值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表