鱼C论坛

 找回密码
 立即注册
查看: 4482|回复: 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 | 显示全部楼层
  1. def factorial(n):
  2.     if n == 0:
  3.         return 1
  4.     return n*factorial(n-1)

  5. l = (int(item) for item in str(factorial(100)))
  6. 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 | 显示全部楼层
  1. def g(xx):
  2.     if xx==1:
  3.         return 1
  4.     else:
  5.         return xx*g(xx-1)
  6.         

  7. def f(x):
  8.     if x//10==0:
  9.         return x
  10.     else:
  11.         return x%10+f(x//10)

  12. temp=int(input('输入数字:'))

  13. y=f(g(temp))

  14. print(y)
复制代码


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

使用道具 举报

发表于 2016-8-2 15:34:07 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:31 编辑
  1. def mul(n):
  2.     if n<=0:
  3.         print('输入错误')
  4.         return -1
  5.     else:
  6.         result=n
  7.         for i in range(1,n):
  8.             result*=i
  9.         if i==n-1:
  10.             a=str(result)
  11.             b=list(a)
  12.             Sum=0
  13.             for j in range(0,len(b)):
  14.                 Sum+=int(b[j])
  15.             if j==len(b)-1:
  16.                 print(Sum)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-26 10:18:05 | 显示全部楼层
  1. total = 1
  2. result = 0
  3. for each in range(1,101):
  4.       total *= each


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

  7. print(result)
复制代码

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

使用道具 举报

发表于 2016-8-27 16:03:03 | 显示全部楼层
  1. n = 1
  2. for i in range(1,101):
  3.     n = n*i
  4. 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):


你的缩进有错误,应该是:
  1. m = 1
  2. y = 0
  3. for i in range(1,101):
  4.         m *= i
  5.        
  6. string = str(m)
  7. for a in string:
  8.         x = int(a)
  9.         y += x
  10. print (y)
复制代码


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

使用道具 举报

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

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

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

使用道具 举报

发表于 2016-10-26 17:02:57 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:32 编辑
  1. num = 100
  2. count = 1
  3. while num:
  4.     count *= num
  5.     num -= 1
  6. print count
  7. print sum(int(i) for i in str(count))
复制代码


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

使用道具 举报

发表于 2017-1-10 23:07:43 | 显示全部楼层
  1. # encoding:utf-8
  2. from math import factorial
  3. from time import time

  4. def euler020(N):
  5.     return sum(int(n) for n in str(factorial(N)))

  6. if __name__ == '__main__':
  7.     start = time()
  8.     print(euler020(100))
  9.     print('cost %.6f sec' % (time() - start))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-18 17:23:02 | 显示全部楼层
此代码使用matlab编程
Problem20所用时间为0.95332秒
Problem20的答案为648
  1. %题目20:算出100!的各位之和
  2. function Output=Problem20(Input)
  3. tic
  4. if nargin==0
  5.     Input=100;
  6. end
  7. Factorial=1;%阶乘数
  8. for ii=2:Input
  9.     Temp=Mul(Factorial,ii);
  10.     Factorial=Temp;
  11. end
  12. toc
  13. Output=sum(Factorial);
  14. disp('此代码使用matlab编程')
  15. disp(['Problem20所用时间为',num2str(toc),'秒'])
  16. disp(['Problem20的答案为',num2str(Output)])
  17. end
  18. %% 子函数
  19. %此函数定义矩阵与数的乘法
  20. function Output=Mul(Input,factor)
  21. if nargin==0
  22. Input=[1 2];%大数矩阵
  23. factor=88;%数
  24. end
  25. L=length(Input);
  26. Input=Input*factor;
  27. for ii=L:-1:2
  28.     if Input(ii)>=10
  29.         Str=num2str(Input(ii));
  30.         Input(ii-1)=Input(ii-1)+(Input(ii)-str2double(Str(end)))/10;
  31.         Input(ii)=str2double(Str(end));
  32.     end
  33. end
  34. if Input(1)>=10
  35.     Front=str2num(num2str(Input(1))')';%对第一位进行处理
  36.     Output=[Front,Input(2:end)];
  37. else
  38.     Output=Input;
  39. end
  40. end


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

使用道具 举报

发表于 2017-3-7 13:48:21 | 显示全部楼层
648


  1. def jiecheng(num):
  2.     if num==0 or num==1: return 1
  3.     else : return num*jiecheng(num-1)
  4. jiecheng100=str(jiecheng(100))
  5. print(sum([int(x) for x in jiecheng100]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  8. print(num)
复制代码


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

使用道具 举报

发表于 2017-3-15 11:29:03 | 显示全部楼层
  1. def Factorial(n):
  2.     if n==1:
  3.         return 1
  4.     else:return n*Factorial(n-1)

  5. list_s=[]
  6. for i in str(Factorial(100)):
  7.     list_s.append(int(i))
  8. print(sum(list_s))
复制代码

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

使用道具 举报

发表于 2017-4-7 00:10:03 | 显示全部楼层
结果:648
代码:
  1. 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 编辑
  1. def g(x):
  2.     s= str(x)
  3.     s = s.strip('0')
  4.     return int(s)


  5. s = 1

  6. for i in range(100,0,-1):
  7.     s = (g(s*i))

  8. sumi = 0

  9. for j in str(s):
  10.     sumi+=int(j)
  11. print(sumi)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2019-6-5 14:42:57 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-2 18:32 编辑

648
0.00010005312254468692秒
  1. import functools
  2. import time


  3. def get_N(n):
  4.     return str(functools.reduce(lambda x, y: x*y, range(1, n+1)))
  5. c = time.clock()
  6. print(sum(map(int, get_N(100))))
  7. print("{}秒".format(time.clock()-c))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-23 00:30:58 | 显示全部楼层
  1. #如有错误请指正

  2. def num_sum(x):            #创建一个函数,接受一个数值表示最大的阶乘数
  3.     init_sum = 1           #声明一个变量用于计算阶乘
  4.     list_sum = 0           #声明一个变量用于处理阶乘结果每位的和
  5.     for a in range(1,x+1): #使用for语句循环计算阶乘的值
  6.         init_sum *= a
  7.     temp_1 = str(init_sum) #注意阶乘的值是整数int,这里将int-->str字符串
  8.     temp_1 = list(temp_1)  #再将字符串转换为列表,这里是注意字符串≠字符串列表
  9.     for temp_2 in temp_1:  #再次循环,首先将字符串列表中的单个字符串转换为int
  10.         list_sum += int(temp_2)#转换为整形的数值累加,也可以先整体转换为整形列表
  11.     return print(list_sum)     #转换为整形列表后使用sum函数求和也行

  12. num_sum(100)
  13. '''代码有些长,逻辑上个人认为比较清楚,最后的和是648'''
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 21:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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