黑马程序员技术交流社区

标题: 算法题 [打印本页]

作者: xiewen    时间: 2013-6-10 15:40
标题: 算法题
本帖最后由 xiewen 于 2013-6-13 19:40 编辑

写一个程序 ,打印出100的阶乘(即1*2*3*…*100)。



作者: 燃灯街    时间: 2013-6-10 17:33
你好,可以自己先定义一个递归算法,

int func(int i)
{
  if(i==0)
     return 1;
  else
    return i*func(i-1);
在main函数中调用System.out.println(func(100));
}
作者: 逝者轨迹    时间: 2013-6-10 17:41
用BigInteger试一下看看,数据太大
作者: 张歆明    时间: 2013-6-10 17:45
循环 和 递归 都行  只能选一个 因为 阶乘没有像前N项和有通项公式  所以  不能直接算  
作者: chouwayメ    时间: 2013-6-10 18:43
本帖最后由 chouwayメ 于 2013-6-11 02:06 编辑


  1. <P>
  2. class Factorial
  3. {
  4. public static void main(String[] args)
  5. {
  6.   StringBuilder sb=new StringBuilder();
  7.   int[] lon=new int[100];//一个int值按最多能计5个位的数.最大值99999次方。该数组能记录500位的十进制的数。
  8.   lon[0]=1;
  9.   for(int i=1;i<101;i++){
  10.    mul(lon,i);  //阶乘
  11.   }
  12.   
  13.    
  14.   for(int j=lon.length-1;j>=0;j--){   //从高位添加进字符串,准备打印
  15.    if(lon[j]!=0)  {     // 用正则补满五位。
  16.                     String tem=Integer.toString(lon[j]).replaceAll("(<A href='file://\\d+)","0000$$$$1'>\\d+)","0000$$$$1</A>");</P>
  17. <P>                   tem=tem.substring(tem.length()-5,tem.length());   sb.append(tem);
  18.        }
  19.    else
  20.       {
  21.        String tem=Integer.toString(lon[j]).replaceAll("0","00000");
  22.        sb.append(tem);
  23.       }
  24.       
  25.      }
  26.    String str=sb.toString().replaceFirst("0*([1-9])","$$$$1");//把前排是零的去除掉
  27.   System.out.println(str+"\r\n"+"位数:"+str.length()); //打印输出
  28.   
  29. }
  30.    
  31. //大数的乘法,用多个变量记住大数。
  32. public static void mul(int[] a,int b){  
  33.   int carry=0;  //准备进位的数,初始为0
  34.   
  35.   for(int i=0;i<a.length;i++){
  36.       a[i]=a[i]*b+carry; //数组的每个数都与因数相乘,且加上进位的数
  37.           {
  38.      carry=a[i]/100000;  //当大于99999时,向前进位,当a[i]不大于99999时,进位数归零
  39.      a[i]=a[i] %100000;  //a[i]截取低位的数 ,只记0-99999的数            
  40.             }
  41.         }
  42.    }
  43. }</P>
复制代码
表示细节很重要,在最后输出时候。。。

作者: xiewen    时间: 2013-6-10 19:55
逝者轨迹 发表于 2013-6-10 17:41
用BigInteger试一下看看,数据太大

好,谢谢!
作者: xiewen    时间: 2013-6-10 19:55
chouwayメ 发表于 2013-6-10 18:43

你的我看不懂!
作者: chouwayメ    时间: 2013-6-10 20:19
xiewen 发表于 2013-6-10 19:55
你的我看不懂!

一个数超大时,就只能用多个变量值组成的字符串来记录这个大数。 主要是这个比较麻烦!
比如a[0]它可以记0到99999的数 那么a[1] a[0]就可以记99999 99999 的数。
一个大数乘以一个因数,就变成上面的算法了。

作者: 十字路口    时间: 2013-6-10 22:54
public static void main(String[] args) {
        double sum=1;
        for(int i=1;i<=100;i++){
                sum*=i;
        }
        System.out.println(sum);
}数据太大了,我用了double类型。最后结果为:9.33262154439441E157
。你看看是不是你要的结果呢。
作者: 袁梦希    时间: 2013-6-12 19:12
楼主你好  如果问题已经解决  请把帖子的类型改为已解决  然后会给你发几个粽子吃
作者: 袁梦希    时间: 2013-6-12 19:12
chouwayメ 发表于 2013-6-10 20:19
一个数超大时,就只能用多个变量值组成的字符串来记录这个大数。 主要是这个比较麻烦!
比如a[0]它可以记 ...

很厉害  哥们




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