求较大整数n的阶乘,因为n较大时n的阶乘超出了正常类型的表示范围,采用数组进行操作(java实现)

package net.yk.mlgorithm;

/**
 * 求较大数的阶乘
 * @author Administrator
 *
 * @param <T>
 */
public class ArraysMul<T> {

public static void main(String[] args) {

int[] array = factorial(1000);
printNum(array);

}

/**
 * 计算两个两组的乘
 * @param a 
 * @param b
 * @return 用数组表示的数字
 */
public static int[] mul(int a[], int b[]) {
int alen = a.length;
int blen = b.length;
int temp = 0;
int len = alen + blen;
int t[] = new int[len];
for (int i = 0; i <= len - 1; i++) {
t[i] = 0;
}

for (int i = 0; i <= alen - 1; i++) {
for (int j = 0; j <= blen - 1; j++) {
temp = a[i] * b[j];
t[j + i] += temp;
}
}

// 将t数组大于10的进行进位操作
carryBit(t);

return t;
}

/**
 * 将数组表示的数字,每位进行进位操作
 * @param a
 */
static void carryBit(int a[]) {

int len = a.length;
int temp;
for (int i = 0; i <= len - 2; i++) {
temp = a[i];
if (temp >= 10) {
a[i] = temp % 10;
a[i + 1] = a[i + 1] + temp / 10;
}

}

}

/**
 * 打印出数字
 * @param a
 */
static void printNum(int a[]) {
int len = a.length;
int f = 0;
for (int i = len - 1; i >= 0; i--) {
if (a[i] > 0)
f = 1;
if (f > 0) {
System.out.print(a[i]);
}

}
}

/**
 * * 将一个数字转换为数字表示
 * @param n
 * @return
 */
static int[] divideNumToArray(int n) {
int bit = bits(n);

int[] array = new int[bit];
int i = 0;
do {
array[i++] = n % 10;
n = n / 10;

} while (n > 0);
return array;
}

/**
 * 返回一个数字有多少位
 * @param n
 * @return
 */
static int bits(int n) {
int cnt = 0;
while (n > 0) {
n = n / 10;
cnt++;
}

return cnt;
}

/**
 * 求n的阶乘
 * @param n
 * @return
 */
static int[] factorial(int n){
int[] result = {1} ;
if(n<0) {
System.out.println("input error");
return  null;
}
if(n ==0){
 result = new int[0];
 result[0] = 1;
 return  result;
}
int bit = bits(n);
int temp[] = new int[bit];

for(int i=1;i<=n;i++){
temp = divideNumToArray(i);

result = mul(temp, result);
}

return result;
}

}

时间: 2024-09-17 21:39:18

求较大整数n的阶乘,因为n较大时n的阶乘超出了正常类型的表示范围,采用数组进行操作(java实现)的相关文章

编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以 及任何的比较语句。

本题要求不能使用if, while, switch, for, ?: 以 及任何的比较语句,也就是要求我们不能用常规的方法来判断两个数的大小. 那么按照以往的方法,要判断两个数的大小,应该要将两个数进行减法运算,将结果与0进行比较.那现在不行进行比较,我们应该怎么办? 我们知道变量分为signed 和 unsigned 两种,有符号变量用最高位代表符号位. 当变量值为负数时,变量值的最高位为1, 当变量值为正数时,最高位为0 基于这种特性,我们可以用一个数组保存用于比较的两个数的值.如array

2737 大整数除法

题目来源:http://bailian.openjudge.cn/practice/2737/描述求两个大的正整数相除的商.输入第1行是被除数,第2行是除数.每个数均不超过100位.输出一行,相应的商的整数部分样例输入237624样例输出99题意描述:计算位数不超过200的两个大整数的商解题思路:总体用减法来模拟除法,当然为了让模拟更高效采用一定的方法. 先将被除数和除数分别存进一维字符数组str1和str2如果被除数的长度小于除数的,直接输出0逆置str1和str2存进数组a和b调用jiand

整数平方根:整数开方及大整数开方解决方法

求整数N的开方,精度在0.001 二分法 若N大于1,则从[1, N]开始,low = 1, high = N, mid = low + (high - low) >> 1开始进行数值逼近 若N小于1,则从[N, 1]开始,low = 0, high = N, mid = low + (high - low) >> 1开始进行数值逼近 #include <stdio.h> #include <stdlib.h> #include <math.h>

HDU - 1002 A + B Problem II (大整数加法)

一道很基础的大整数加法. 简单的说一下思路吧. 先用字符串读取两个大数.首先需要把数组给初始化为0方便以后处理,然后对数组逆序对齐处理,接着相加转化后的两个数组并把之存进结果数组里面,最后对结果数组进行进位处理. 看代码吧. #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <queue> #include <stac

POJ 1181 大整数是否为素数以及求大整数的质因数-数论-(Miller_rabin+Pollard_rho)

题意:求一个整数是否是素数,如果不是,则输出它最小的质因数. 分析: 判断一个大整数是否为素数用Miller_rabin算法,求一个大整数的所有质因数用Pollard_rho算法.这题就是直接套模板. 另外这里的gcd和pow_mod不能用一般的方式,T了.代码里我注释掉的就是T了的写法. 代码: #include<iostream> #include<cmath> #include<ctime> #include<cstdio> #include<a

关于大整数的加减乘除求余运算 java

自己用java 实现了大字符串整数的加减乘除和求余运算, 加减法的算法是模拟手工笔算的计算过程, 除法就是从最高位不停的减操作, 乘法的算法 :遍历一个数的各个位数以及他所在位置,另一个数根据这个数的位置末位添n个0,然后累加次数为这个位置数的数值 原创代码如下: public class Demo6 { public static void main(String[]args){ System.out.println(add("-989","989")); Sys

求两个大整数相乘的积,数字长度在127个字符之内。

计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位). 方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal; 方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平. 此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性. 1.主函数 import java.math.BigDecimal; import java.util.Scanner;

N!的阶乘附带简单大整数类的输入输出(暂时没有深入的了解)

Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! 我的思路:就想着大整数类去了,才发现自己还不能很好的掌握,其实这是一个大整数与int的乘法,一个50000的数组完全可以解决,看来分析问题的能力还是比较弱呀,希望能够提升分析问题的全局能力! #include<iostream>#include<cstdio>#include<string>#include<cstring>#inc

[算法]:分治法-求大整数相乘

#问题大整数相乘 #思路说明 对于大整数计算,一般都要用某种方法转化,否则会溢出.但是python无此担忧了. Python支持**"无限精度"的整数,**一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型. 例如: >>> 2899887676637907866*1788778992788348277389943 51872581574157002360341697913