A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiewen 中级黑马   /  2013-6-10 15:40  /  1876 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xiewen 于 2013-6-13 19:40 编辑

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


评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

10 个回复

正序浏览
chouwayメ 发表于 2013-6-10 20:19
一个数超大时,就只能用多个变量值组成的字符串来记录这个大数。 主要是这个比较麻烦!
比如a[0]它可以记 ...

很厉害  哥们
回复 使用道具 举报
楼主你好  如果问题已经解决  请把帖子的类型改为已解决  然后会给你发几个粽子吃
回复 使用道具 举报
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
。你看看是不是你要的结果呢。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
xiewen 发表于 2013-6-10 19:55
你的我看不懂!

一个数超大时,就只能用多个变量值组成的字符串来记录这个大数。 主要是这个比较麻烦!
比如a[0]它可以记0到99999的数 那么a[1] a[0]就可以记99999 99999 的数。
一个大数乘以一个因数,就变成上面的算法了。
回复 使用道具 举报
xiewen 中级黑马 2013-6-10 19:55:41
7#

你的我看不懂!
回复 使用道具 举报
逝者轨迹 发表于 2013-6-10 17:41
用BigInteger试一下看看,数据太大

好,谢谢!
回复 使用道具 举报
本帖最后由 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>
复制代码
表示细节很重要,在最后输出时候。。。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
循环 和 递归 都行  只能选一个 因为 阶乘没有像前N项和有通项公式  所以  不能直接算  
回复 使用道具 举报
用BigInteger试一下看看,数据太大
回复 使用道具 举报
你好,可以自己先定义一个递归算法,

int func(int i)
{
  if(i==0)
     return 1;
  else
    return i*func(i-1);
在main函数中调用System.out.println(func(100));
}

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马