LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 958|回复: 4

用来计算20000!的程序,请朋友们检查是否存在错误

[复制链接]
发表于 2004-2-6 13:51:24 | 显示全部楼层 |阅读模式
//该程序是计算较大数字的阶乘的,当然最大可计算的阶乘受SIZE的限止
//一般的程序能够计算的不大于100!,要计算大数的阶乘法,就得用大数计算的方法
//我用该程序能够算出2000!,但不知道是否正确,前面的正确的
package untitled2;
import java.io.*;
public class Frame1{
  public static void main(String params[ ]) throws IOException{
   int N=0,Digit;
   final int SIZE=200000;
   int numbers[ ]=new int[SIZE+1];//存放N!的各个位
   BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
   System.out.print("lease Input a Number and press Enter Key:");
   try{ N = Integer.parseInt(br.readLine());}//输入要计算阶乘数字
   catch(Exception e){System.out.print("IO Error!");System.exit(0); }
   Digit=1;numbers[1]=1;
   for(int i=1;i<=N;i++){//开始循环计算阶乘
     for(int j=1;j<=Digit;j++)numbers[j]*=i;//计算i!,并将初次结果放在数组中         
     //下面是对已经得到的阶乘进行调整,使每个数组元素只放一位数字,最高位在下次调整!
     for(int j=1;j<=Digit;j++){
        if (numbers[j] > 9) {         
          numbers[j + 1] = numbers[j + 1] + numbers[j] / 10;
          numbers[j] = numbers[j] % 10;
         }
       }                     
     if(numbers[Digit+1]>0)Digit+=Integer.toString(numbers[Digit+1]).length();//计算当前的总位数         
     //下面是防止数组溢出
     if(Digit>=SIZE-1){
       System.out.println("Array IndexBound Overflow!");
       System.out.println("Lotal numbers:"+Digit);
       System.exit(0);
     }
   }
     int K=numbers[Digit+1]>0?Digit+1:  Digit;
     System.out.print(N+"!=");
     for(int j=K;j>0;j--)System.out.print(numbers[j]);//输出i的阶乘
     System.out.print("\n");
}
}
发表于 2004-2-8 00:25:52 | 显示全部楼层
我觉得你的 SIZE 有问题。
“ int numbers[ ]=new int[SIZE+1];//存放N!的各个位 ”
你把最终结果的数设为 SIZE+1 的长度,如果我定义 SIZE=4 可你不能保证 比如 1999! x 2000 的长度只有5位呀?
“ for(int j=1;j<=Digit;j++)numbers[j]*=i;//计算i!,并将初次结果放在数组中 "
这句你将上次阶乘结果的每一位同 i 乘,当 i 还是个位数的时候没什么问题,但当 i >= 10 的时候还对吗?
发表于 2004-2-8 16:19:07 | 显示全部楼层
用gmp库
 楼主| 发表于 2004-2-14 00:51:57 | 显示全部楼层
最初由 qianzheng82 发表
我觉得你的 SIZE 有问题。
“ int numbers[ ]=new int[SIZE+1];//存放N!的各个位 ”
你把最终结果的数设为 SIZE+1 的长度,如果我定义 SIZE=4 可你不能保证 比如 1999! x 2000 的长度只有5位呀?
“ for(int j=1;j<=Digit;j++)numbers[j]*=i;//计算i!,并将初次结果放在数组中 "
这句你将上次阶乘结果的每一位同 i 乘,当 i 还是个位数的时候没什么问题,但当 i >= 10 的时候还对吗?



//下面是对已经得到的阶乘进行调整,使每个数组元素只放一位数字,最高位在下次调整!
for(int j=1;j<=Digit;j++){
if (numbers[j] > 9) {
numbers[j + 1] = numbers[j + 1] + numbers[j] / 10;
numbers[j] = numbers[j] % 10;
}
发表于 2004-2-23 21:55:20 | 显示全部楼层
我觉得楼主的算法可能有问题(不是说错,差不多肯定是对的),但一般这种数字记得是用递归法算的(差不多就是一个二叉树,到底是怎么的,我忘记了),可以快很多,还有就是好像算这种东西一般是用fortran来算的(至少几年前是这样的,看到过,但没试过,不是很肯定),如果有兴趣的话,可以试试.
计算机前辈wirth说:程序=算法+syntax,现在可能还要加gui...请楼主明签
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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