Project Euler 20题

6视图(30天)
乔纳斯Hzf
乔纳斯Hzf 2018年7月11日
评论道: Michiele Ogbagabir 2018年7月11日
你好,我有一个问题关于我的代码来解决以下问题的项目欧拉(https://projecteuler.net/problem=20)
* n !意味着n××(n−1)……×3×2×1
例如,10 != 10×9×……×3×2×1 = 3628800,在10号位数之和!是3 + 6 + 2 + 8 + 8 + 0 + 0 = 27。
找到100号数字的总和! *
我用下面的代码来解决问题(我不知道这是高度复杂的,我已经看到其他解决方案,但是我想让它工作这种方式)万博 尤文图斯
所有测试值,脚本我试着好好的工作,给予正确的答案,虽然100它给683的价值,而不是正确的648。你能帮我找到原因了吗?
谢谢你!
金额= 0;
刺激= 1;
i = 1:20
刺激=刺激*我;
结束
StrProd = num2str(刺激,“% .0f”)
i = 1:长度(StrProd)
和=和+ str2num (StrProd(我));
结束
4评论
杰夫•海斯
杰夫•海斯 2018年7月11日
乔纳斯-你可以看到从上面的字符串,这是错了。自从你100年!包括100、90、80、70……20岁和10,那么我希望看到这个号码终止与11 0。

登录置评。

接受的答案

Michiele Ogbagabir
Michiele Ogbagabir 2018年7月11日
如果你做
类(刺激)
你会发现这是一个双重数据类型。在matlab中双类型有16个小数位数精度和100 !显然不止于此。而不是默认的双精度值,初始化您的刺激变量作为象征性的类型。将你的符号类型转换为字符数组,使用
char(刺激)
而不是
num2str(刺激)
这应该给你正确的答案。
5个评论
Michiele Ogbagabir
Michiele Ogbagabir 2018年7月11日
我很抱歉。我应该澄清这部分。谢谢你澄清Goeff。很高兴现在工作。

登录置评。

答案(1)

杰夫•海斯
杰夫•海斯 2018年7月11日
乔纳斯,我不知道这个问题是想让你想出另一种(a 循环)算法来找到100年的数字的总和!。例如,如果我关心20 !,然后我有数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
有什么数字在上面的列表,我可以排除吗?1没有影响,因此它可以删除。10只附加零结束的产品所以没有影响之和。所以我可以减少的数字列表
2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20
20 10 * 2是一样的,如果我忽略了10(同前所述原因),那么我的清单
2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 2
4 * 5 = 20所以我可以用2代替这两个数字
2 3 2 6 7 8 9 11 12 13 14 15 16 17 18 19 2
14 * 15 = 210(= 21 * 10)所以我现在变成列表
2 3 2 6 7 8 9 11 12 13 21 16 17 18 19 2
所以你可以做类似100年!删除任何数据,不影响数字的总和(10100),然后替换所有的其他10:整除(20、30、40岁…,90)与(2、3、4,…,9)。你可以替换所有成对的数字10:是谁的产品(4、5),(14、15),…(94,95)与(2)这样的一个等价的,(21),…,(893)。这可能导致一个数字列表的产品更易于管理,你可以正确地转换为一个字符串。
请注意,这是不能保证工作,只是提供了一个可供选择的方法 也许 找到解决方案。
1评论
乔纳斯Hzf
乔纳斯Hzf 2018年7月11日
嗨,杰夫,有趣的方法!
这可能是一种方式来解决这个问题,一般问题是故意开放我认为多个解决方案的机会,因为他们也开放的平台/语言的编程。
另一个解决方案,我发现Matlab是这样的
disp(总和(str2num (strread (char (prod(信谊(1:10 0))),“% c”))));

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!