黑马程序员技术交流社区

标题: 【已解决】求100!的问题,结果是0,求解释?该怎样求结果 [打印本页]

作者: hello world    时间: 2012-8-7 08:59
标题: 【已解决】求100!的问题,结果是0,求解释?该怎样求结果
本帖最后由 刘向阳 于 2012-8-7 12:57 编辑

class MethodTest
{
public static void main(String[] args)
{
   int sum=getSum(100);
  System.out.println("sum="+sum);
}
public static int getSum(int n)
{
  if(1 == n)
  {
   return 1;
  }
  
  int sum =getSum(n-1)*n ;
  return sum;
}
程序运行结果为0,求高手指点啊,为什么不能算出结果或者是报告异常?要怎样能求出正确的结果那?
作者: 杨卓儒    时间: 2012-8-7 09:05
本帖最后由 杨卓儒 于 2012-8-7 09:06 编辑

楼主好好查查return的属性,有return就返回了,而且,if是判断语句,只判断一回哦,你这里不是循环~~~~~~ 你好好改改
class MethodTest
{
public static void main(String[] args)
{
   int sum=getSum(100);
  System.out.println("sum="+sum);
}
public static int getSum(int n)
{
int x,sum=0;

  while(int x!=n)
  {
   x++;
   sum=sum+x;
  }
  
  return sum;
}

作者: hello world    时间: 2012-8-7 09:12
杨卓儒 发表于 2012-8-7 09:05
楼主好好查查return的属性,有return就返回了,而且,if是判断语句,只判断一回哦,你这里不是循环~~~~ ...

汗,兄台,你知道递归调用不?
作者: pphdsny3    时间: 2012-8-7 09:13
下面的代码就行了,因为int类型的最大值不足以满足100!的值,因为100!的值太大了,把数据类型换成double就行了。
  1. public class MethodTest {
  2.         public static void main(String[] args) {
  3.                 double sum = getSum(100);
  4.                 System.out.println("sum=" + sum);
  5.         }

  6.         public static double getSum(int n) {
  7.                 if (1 == n) {
  8.                         return 1;
  9.                 }

  10.                 double sum = getSum(n - 1) * n;
  11.                 System.out.println(sum);
  12.                 return sum;
  13.         }
  14. }
复制代码
运行结果:
  1. 2.0
  2. 6.0
  3. 24.0
  4. 120.0
  5. 720.0
  6. 5040.0
  7. 40320.0
  8. 362880.0
  9. 3628800.0
  10. 3.99168E7
  11. 4.790016E8
  12. 6.2270208E9
  13. 8.71782912E10
  14. 1.307674368E12
  15. 2.0922789888E13
  16. 3.55687428096E14
  17. 6.402373705728E15
  18. 1.21645100408832E17
  19. 2.43290200817664E18
  20. 5.109094217170944E19
  21. 1.1240007277776077E21
  22. 2.585201673888498E22
  23. 6.204484017332394E23
  24. 1.5511210043330986E25
  25. 4.0329146112660565E26
  26. 1.0888869450418352E28
  27. 3.0488834461171384E29
  28. 8.841761993739701E30
  29. 2.6525285981219103E32
  30. 8.222838654177922E33
  31. 2.631308369336935E35
  32. 8.683317618811886E36
  33. 2.9523279903960412E38
  34. 1.0333147966386144E40
  35. 3.719933267899012E41
  36. 1.3763753091226343E43
  37. 5.23022617466601E44
  38. 2.0397882081197442E46
  39. 8.159152832478977E47
  40. 3.3452526613163803E49
  41. 1.4050061177528798E51
  42. 6.041526306337383E52
  43. 2.6582715747884485E54
  44. 1.1962222086548019E56
  45. 5.5026221598120885E57
  46. 2.5862324151116818E59
  47. 1.2413915592536073E61
  48. 6.082818640342675E62
  49. 3.0414093201713376E64
  50. 1.5511187532873822E66
  51. 8.065817517094388E67
  52. 4.2748832840600255E69
  53. 2.308436973392414E71
  54. 1.2696403353658276E73
  55. 7.109985878048635E74
  56. 4.052691950487722E76
  57. 2.350561331282879E78
  58. 1.3868311854568986E80
  59. 8.320987112741392E81
  60. 5.075802138772248E83
  61. 3.146997326038794E85
  62. 1.98260831540444E87
  63. 1.2688693218588417E89
  64. 8.247650592082472E90
  65. 5.443449390774431E92
  66. 3.647111091818868E94
  67. 2.4800355424368305E96
  68. 1.711224524281413E98
  69. 1.197857166996989E100
  70. 8.504785885678622E101
  71. 6.123445837688608E103
  72. 4.4701154615126834E105
  73. 3.3078854415193856E107
  74. 2.480914081139539E109
  75. 1.8854947016660498E111
  76. 1.4518309202828584E113
  77. 1.1324281178206295E115
  78. 8.946182130782973E116
  79. 7.156945704626378E118
  80. 5.797126020747366E120
  81. 4.75364333701284E122
  82. 3.945523969720657E124
  83. 3.314240134565352E126
  84. 2.8171041143805494E128
  85. 2.4227095383672724E130
  86. 2.107757298379527E132
  87. 1.8548264225739836E134
  88. 1.6507955160908452E136
  89. 1.4857159644817607E138
  90. 1.3520015276784023E140
  91. 1.24384140546413E142
  92. 1.1567725070816409E144
  93. 1.0873661566567424E146
  94. 1.0329978488239052E148
  95. 9.916779348709491E149
  96. 9.619275968248206E151
  97. 9.426890448883242E153
  98. 9.33262154439441E155
  99. 9.33262154439441E157
  100. sum=9.33262154439441E157
复制代码

作者: 杨卓儒    时间: 2012-8-7 09:15
刘向阳 发表于 2012-8-7 09:12
汗,兄台,你知道递归调用不?

ca!  kan cuo le ! wo yi wei ni yao qiu 1-100de he ne
作者: hello world    时间: 2012-8-7 09:16
黑马王鹏 发表于 2012-8-7 09:13
下面的代码就行了,因为int类型的最大值不足以满足100!的值,因为100!的值太大了,把数据类型换成double就 ...

额,是啊,我怎么没想到换成double 那,曾换成long试过,结果也还是0,那我在请教下,为什么结果是0那?怎么不是异常那?
作者: pphdsny3    时间: 2012-8-7 09:21
刘向阳 发表于 2012-8-7 09:16
额,是啊,我怎么没想到换成double 那,曾换成long试过,结果也还是0,那我在请教下,为什么结果是0那? ...

你自己想想,他会报什么异常呢,因为数字的预算最终还是2进制的加减,当数值大的超过它本身的最大值时,它一次性加太多了,导致2进制位上全是0,显示的当然还是0咯,有时也会显示出Infinity无穷大(个人理解,不一定正确,一起探讨)
作者: 王程    时间: 2012-8-7 09:29
你把sum定义成int类型,而程序运算的数据已经超过了int类型的最大值,所以就变成0了,如果把100改成小一点的值,还是可以的,或者用BigDecimal对象,可以和基本数据类型转换。
作者: hello world    时间: 2012-8-7 09:37
黑马王鹏 发表于 2012-8-7 09:21
你自己想想,他会报什么异常呢,因为数字的预算最终还是2进制的加减,当数值大的超过它本身的最大值时, ...

恩,应该是这么个理。我也是当初很是费解,所以才向大家请教下
作者: hello world    时间: 2012-8-7 09:39
王程 发表于 2012-8-7 09:29
你把sum定义成int类型,而程序运算的数据已经超过了int类型的最大值,所以就变成0了,如果把100改成小一点 ...

恩 谢了  改小点我知道,  就是当初不明白  超过了int  所能接受的最大值了  居然没有报告异常,而是0  让我很是难以理解
作者: 潘星    时间: 2012-8-7 09:56
打印结果难道不是100*99*........*1吗,着实不懂
作者: hello world    时间: 2012-8-7 09:59
潘星 发表于 2012-8-7 09:56
打印结果难道不是100*99*........*1吗,着实不懂

怎么了,就是求到100的阶乘啊,只不过超出范围了,结果就会是0,得不到正确的结果了
作者: 潘星    时间: 2012-8-7 10:06
刘向阳 发表于 2012-8-7 09:59
怎么了,就是求到100的阶乘啊,只不过超出范围了,结果就会是0,得不到正确的结果了 ...

原来超出范围范围结果会是0啊,我还以为是乘了一个0导致的,哎
作者: hello world    时间: 2012-8-7 10:11
潘星 发表于 2012-8-7 10:06
原来超出范围范围结果会是0啊,我还以为是乘了一个0导致的,哎

呵呵,你可以自己做做看 不就知道了嘛  不要光看代码  而是自己敲了  就会发现问题了
作者: 刘润辰    时间: 2012-8-7 10:43
早上好呀。。。
作者: hello world    时间: 2012-8-7 10:46
刘润辰 发表于 2012-8-7 10:43
早上好呀。。。

早上好,呵呵  又是奋斗的一天  come on
作者: 王峰    时间: 2012-8-7 11:59
楼主,你的int值保存不了这么大的值,用double可以,

11111111111111.jpg (56.5 KB, 下载次数: 2)

11111111111111.jpg

作者: hello world    时间: 2012-8-7 12:57
龙卷风V龙卷风 发表于 2012-8-7 11:59
楼主,你的int值保存不了这么大的值,用double可以,

恩  知道了  谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2