找回密码
 欢迎注册
查看: 25010|回复: 4

[求助] 这个程序运行结果不正确?不知哪里错了?

[复制链接]
发表于 2016-12-10 10:40:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 TSC999 于 2016-12-10 10:41 编辑

求一个整数(例如 123456789)的各位数字之和,mathematica 可以用下面这指令:
  1. lst = IntegerDigits[123456789]         
  2. Sum[lst[[k]], {k, 1, Length[lst]}]
复制代码

问题是:
我想统计 1,2,3,4,……,2015,2016 这个连续数列中, 各位数字之和等于 1 的有几个?等于 2 的有几个?……,等于 30 的有几个?
【注: 估计其中 1999 有最大的数字和,等于 1+9+9+9=28。】如何写程序? 看似简单,我写来写去玩不转。
  1. (* 在 1,2,3,4,\[Ellipsis],2015,2016 中,它们的各位数字和是 1,2,3,\[Ellipsis]\
  2. \[Ellipsis],28。问:每一种和数有多少个?*)

  3. Table[f[i] = 0, {i, 1, 30}];
  4. For[i = 1, i <= 2016, i++,
  5. lst = IntegerDigits[i];
  6. s = Sum[lst[[k]], {k, 1, Length[lst]}]]
  7.   For[j = 1, j <= 30, j++,
  8. If[s == j, f[j] = f[j] + 1];
  9. ]
  10. For[j = 1, j <= 30, j++,
  11.   Print[j, "---", f[j]]];
复制代码

上面这个代码运行结果不正确。不知哪里错了?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2016-12-10 13:06:13 | 显示全部楼层
你相当于把Mathematica当做C语言来使用,但总是出错,为啥不直接用C语言?
MMA本身是一种符号语言,使用的是是函数式编程,这是最接近通常的数学思维习惯的表达,并且高效简洁。不要用C的思维来编写MMA程序,不仅编写的程序繁琐难读,而且效率也比函数式编写的要低。
  1. Total /@ IntegerDigits@Range[2016] // Tally
复制代码
结果:
\[\left(
\begin{array}{cc}
1 & 4 \\
2 & 10 \\
3 & 18 \\
4 & 27 \\
5 & 38 \\
6 & 51 \\
7 & 66 \\
8 & 83 \\
9 & 102 \\
10 & 119 \\
11 & 133 \\
12 & 142 \\
13 & 148 \\
14 & 150 \\
15 & 148 \\
16 & 142 \\
17 & 132 \\
18 & 118 \\
19 & 100 \\
20 & 81 \\
21 & 64 \\
22 & 49 \\
23 & 36 \\
24 & 25 \\
25 & 16 \\
26 & 9 \\
27 & 4 \\
28 & 1 \\
\end{array}
\right)\]

点评

@TSC999,MMA有帮助文档,也自带很详细的教程,分类明确,如果有心还是能学会的。  发表于 2016-12-12 10:18
确实很简练。 我对【列表】指令知之甚少,所以写不出好的程序。  发表于 2016-12-11 20:50
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2016-12-11 09:45:48 | 显示全部楼层
粗看了下,分号/(语句结束符)不正确。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-12-27 09:47 , Processed in 0.025713 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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