黑马程序员技术交流社区

标题: 【技术提问】计算1000!的值,求代码 [打印本页]

作者: 蓝墨清幽    时间: 2015-4-20 10:18
标题: 【技术提问】计算1000!的值,求代码
1000!=1*2*3*.......*1000
求代码

作者: 一个好人    时间: 2015-4-20 10:25
这样的结果显示不出来,太长。但是我记得原题是问有多少个0 对吧
作者: zhiweiqi    时间: 2015-4-20 13:56
方法一:
int sum=1;
for(int i=1;i<=1000;i++)
{
   sum=sum*i;
}
System.out.println(sum);
方法二:
BigInteger b=new BigInteger("1");
for(int i=1;i<=1000;i++)
{
   b=b.multiply(new BigInteger(String.valueOf(i)));
}
String s=b.toString();
System.out.println(s);
作者: q8387811    时间: 2015-4-20 14:00
用BigInterger 暴力计算!
作者: YQliang    时间: 2015-4-20 16:10
那个暴力计算好暴力啊
作者: Wilsoncyf    时间: 2015-4-20 16:18
要用BigInterger
作者: jiao142857    时间: 2015-4-20 18:31
本帖最后由 jiao142857 于 2015-4-20 18:32 编辑

百度了下
package heima;

class PowerOf1000
{

  public static void main(String[] args)
  {
    int[] digits = new int[2568];//他预先知道了位数  
    int max_digit = 2567;
    digits[max_digit] = 1;
    for (int d=2;d<=1000;d++)
    {
      for (int k=max_digit; k<digits.length; k++)
        digits[k] *= d;

      int k = digits.length-1;
      while (k>=max_digit)
      {
        if (digits[k]>10)
        {
          digits[k-1] += digits[k] / 10;
          digits[k] = digits[k] % 10;
          if (k-1<max_digit) max_digit = k-1;
        }
        k--;
      }
    }
    for (int i=max_digit; i<digits.length; i++)
    {
      System.out.print(digits);
   
}
    System.out.println();
  }
}
作者: 一诺珍惜    时间: 2015-4-20 19:15
本帖最后由 一诺珍惜 于 2015-4-20 19:21 编辑

package javaC.com.itheima;
/*
* 9、 求1000!的结果中包含多少个0?注:1000! = 1×2×3×4×5×...×999×1000
*/
import java.math.BigInteger;//调用大数据类
public class Test9 {
public static void main(String []args){
   BigInteger res=new BigInteger("1");//创建一个大数据类 ,包含一个整型值res=1
   for(int i=1;i<=1000;i++){//做一个循环,获得1到1000的数
          String j=String.valueOf(i);//将数值类型i转换成字符串类型j
           BigInteger s=new BigInteger(j); //将字符串类型j包装到大数据类型s中
           res=res.multiply(s);//将1000!的值存到res中
   }
   String r=res.toString();//将大数据类型res转换成字符串类型,存到字符串r中
   int count=0;//定义计数器
   for(int i=0;i<r.length();i++){//做一个循环,获得r的位数
           if(r.charAt(i)=='0')//如果r中的该位数为0;
                   count++;  //则计数器加上一次
   }
   System.out.println("1000!的结果包含"+count+"个0");
}
}


作者: 一诺珍惜    时间: 2015-4-20 19:17
跟那个基础测试第9题比较像,这里自己就复制过来了
作者: 一诺珍惜    时间: 2015-4-20 19:26
特别注意的是数值类型int和它的包装类是不能进行直接转换的,所以需要先吧int型转换成字符串型然后再包装到大数据类型中。
作者: 1017161726    时间: 2015-4-20 20:20
不看这个还不知道呢。原来二十几的阶乘就超过long的范围了。。可怕啊。我说怎么调成 1000! 结果是0,改成100!结果还是0,原来是超范围了。
作者: lzh2015    时间: 2015-4-20 20:37
关键俩部,到现在也没学到,普通的类型,根本装不 下,      那么长的得数怎么转换成字符串,用遍历去累计
作者: itheima_llt    时间: 2015-4-20 20:52
有意义,有收获,谢谢提供
作者: 最好的我    时间: 2015-4-20 20:57
新手路过~~看看就好~~慢慢学习~
作者: ROFFY    时间: 2015-4-20 21:43
BigInteger
作者: zhiweiqi    时间: 2015-4-22 00:00
zhiweiqi 发表于 2015-4-20 13:56
方法一:
int sum=1;
for(int i=1;i

感谢指正,方法一确实太草率,行不通,因为1000!的结果是一个大数据,需要的存储空间比较大,而int的存储空间是装不了它的,方法一舍弃吧。
作者: mono    时间: 2015-4-22 09:41
赞一个、、
作者: 蓝墨清幽    时间: 2015-4-22 09:57
一诺珍惜 发表于 2015-4-20 19:15
package javaC.com.itheima;
/*
* 9、 求1000!的结果中包含多少个0?注:1000! = 1×2×3×4×5×...×99 ...

:victory:不错,很赞,不过你这里是计算有几个0的。
作者: 刘斌斌    时间: 2015-4-22 10:03
BigInterger   没错
作者: 胡几手    时间: 2015-4-22 10:12
学习了。好多大神。
作者: 一诺珍惜    时间: 2015-4-22 20:39
蓝墨清幽 发表于 2015-4-22 09:57
不错,很赞,不过你这里是计算有几个0的。

res就是1000!的值啊- -你直接用System.out.print(res);就OK了- -就可以求出1000!的值了- -我注释都写了- -你可以去看看- -这个相当于当延伸看吧- -
作者: 想不到了解    时间: 2015-4-22 22:25
度娘吧,一切问题都有答案.
作者: 蓝墨清幽    时间: 2015-4-26 09:32
一诺珍惜 发表于 2015-4-22 20:39
res就是1000!的值啊- -你直接用System.out.print(res);就OK了- -就可以求出1000!的值了- -我注释都写了 ...

:victory:学习了。




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