NYOJ28大数阶乘

来源:互联网 发布:python与weka的区别 编辑:程序博客网 时间:2024/05/18 03:05
描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
输入
输入一个整数m(0<m<=5000)
输出
输出m的阶乘,并在输出结束之后输入一个换行符
样例输入
50
样例输出

30414093201713378043612608166064768844377641568960512000000000000

大数乘法,在java中可以使用biginteger类直接进行相关数的四则运算。biginteger类使用数组来存储计算中使用的大数。在内存足够的前提条件下理论可以进行无限位数的运算。
例:

import java.math.BigDecimal;public class Test {    public static void main(String[]args){        BigDecimal a=new BigDecimal("12143532456424513243124231.423634512344214");        BigDecimal b=new BigDecimal("12432534652453532543654534.234235436547658798707685365636");//用字符串对大数进行初始化        BigDecimal c;        c=a.add(b);        System.out.println(c);        c=a.subtract(b);//减法        System.out.println(c);        c=a.multiply(b);        System.out.println(c);        c=a.divide(b,2,BigDecimal.ROUND_HALF_UP);//除法的函数和上述有少许不同,其中参数2即保留位数,round_half_up即四舍五入        System.out.println(c);    }}数组乘法可以将其分解为数组加法和数组和个位数的乘法。因为每个数组元素内只可能有单个数,所以为节省空间可以开成char型的数组/*nyoj28 唐小晨000 2016-8-2*/import java.util.Scanner;import static java.lang.System.out;public class Main{public static void main(String[]args){int num;Scanner in=new Scanner(System.in);num=in.nextInt();int[]res=new int[]{1};//long begin=System.currentTimeMillis();for(int i=1;i<=num;i++){res=fun(res,tran(i));}for(int i=res.length-1;i>=0;i--)out.print(res[i]);out.println();//long end=System.currentTimeMillis();//out.println((end-begin)+"ms");}    //将一个普通整数转化为数组形式表示public static int[]tran(int a){int size=0;int[]t=new int[5];do{t[size++]=a%10;a/=10;}while(a!=0);int[]res=new int[size];for(int i=0;i<size;i++){res[i]=t[i];}return res;}    //一位数与数组相乘,返回结果的数组表示public static int[]count(int[]f1,int f2){int pow=0;    //进位数int[]t=new int[f1.length];   //不包括首位的结果for(int i=0;i<t.length;i++){int sum=f1[i]*f2+pow;pow=sum/10;t[i]=sum%10;}if(pow!=0){int[]res=new int[f1.length+1];    //包含首位的结果,如果最后有进位则提交此数组for(int i=0;i<t.length;i++)res[i]=t[i];res[f1.length]=pow;return res;}else{return t;    //若不包含进位则提交此数组}    //若不讨论相关情况可能出现首位多出一个零的情况}    //两个数组大数相乘public static int[]fun(int[]f1,int[]f2){int max=f1.length+f2.length-1;int[]res=new int[max+1];    //保存最终结果for(int i=0;i<f2.length;i++){int[]t=count(f1,f2[i]);    //大数数组和一位相乘int pow=0;for(int j=0;j<t.length;j++){res[i+j]+=(t[j]+pow);    //需要向前移动j位后相加pow=res[i+j]/10;res[i+j]%=10;}if(pow!=0){res[i+t.length]=pow;}}//最后同样要进行count函数中的操作防止首位出现零if(res[max]!=0){return res;}else{int[]t=new int[max];for(int i=0;i<max;i++){t[i]=res[i];}return t;}}}



























        

0 0
原创粉丝点击