public class Test {
private static int m = 1000;
private static int[] data = new int[m]; // 第一位存储数的长度,从第二位开始依次从低位向高位存储每位数字
private static int[] carry = new int[m];// 存储每次乘积的进位
private static int[] attData = new int[m];
/**
* 初始化数组data
*/
static void init() {
int i;
for (i = 2; i <= (m - 1); i++) {
data[i] = 0;
data[0] = 1;// 开始只有1位数
data[1] = 1;// 0的阶乘为1
}
}
/**
*
*
* @param iStartIndex
* 调整的起始位置
* @param iPlus
* 进位值
* @param array
* 要调整的数组
*/
static void adj_carry(int iStartIndex, int iPlus, int array[]) {
while (array[iStartIndex] + iPlus >= 10)// 向高位进
{
array[iStartIndex] = (array[iStartIndex] + iPlus) % 10;
iPlus = (array[iStartIndex] + iPlus) / 10;
iStartIndex++;
}
array[iStartIndex] += iPlus;
}
/**
* 用当前的数每别乘以data数组里从第二位开始的数,同时完成进位
*
* @param i
* @param iNum
*/
static void goon(int i, int iNum)// i:当前乘的位数 M-1>= i >=1; iNum:当前的阶乘子
{
int iTotal = data[i] * iNum;// 当前的总数
data[i] = iTotal % 10;
if (iTotal >= 10) {
adj_carry(i + 1, iTotal / 10, carry);// 调整进位数组
}
}
/**
* 调整阶乘位数
*/
static void adj_total() {
int i;
for (i = m - 1; i >= data[0]; i--)
if (data[i] > 0) {
data[0] = i;// 共有i位 break;
}
}
/**
* 将进位加至和数数组
*/
static void add_carry_to_data() {
int i;
int iTotal;
for (i = 1; i <= m - 1; i++) {
iTotal = data[i] + carry[i];
data[i] = iTotal % 10;
if (iTotal >= 10)// 进位
{
adj_carry(i + 1, iTotal / 10, data);// 调整进位数组
}
}
}
/**
* 进位数组清0
*/
static void clear_carry() {
int i;
for (i = 1; i <= m - 1; i++)
carry[i] = 0;
}
/**
* 阶乘
*
* @param iNum
*/
static void Mul(int iNum) {
init();
int i, j;
for (i = 1; i <= iNum; i++) {
for (j = 1; j <= data[0]; j++)
goon(j, i);
add_carry_to_data();// 将进位数组加至和数组
adj_total();// 调整总位数
clear_carry();// 清0进位数组,准备下一次阶乘
}
}
/**
* 阶乘
*
* @param iNum
*/
static void Mul(int iNum, boolean flag) {
init();
int i, j;
for (i = 1; i <= iNum; i++) {
for (j = 1; j <= data[0]; j++)
goon(j, i);
add_carry_to_data();// 将进位数组加至和数组
adj_total();// 调整总位数
clear_carry();// 清0进位数组,准备下一次阶乘
}
System.out.print(iNum + "!=");
for (i = data[0]; i >= 1; i--) {
System.out.print(data[i]);
}
System.out.println();
System.out.println();
}
// 加法
static void add(int iNum, int jNum) {
System.out.println();
System.out.print(iNum + "!+" + jNum + "!=");
Mul(iNum);
// 得到 2个阶乘的数组 加数为mainData 被加数为data
for (int i = 0; i < m - 1; i++) {
attData[i] = data[i];
}
Mul(jNum);
int i;
int num = attData[0] > data[0] ? attData[0] : data[0];
for (i = 1; i < num; i++) {
addStart(i);
}
add_carry_to_data();// 将进位数组加至和数组
adj_total();// 调整总位数
clear_carry();// 清0进位数组,准备下一次阶乘
for (i = data[0]; i >= 1; i--) {
System.out.print(data[i]);
}
System.out.println();
}
// 减法
// 3 - 5
static void sub(int iNum, int jNum) {
System.out.print(iNum + "!-" + jNum + "!=");
String flag = "";
// 得到 2个阶乘的数组 减数为data 被减数为attData
if (iNum < jNum) {
// iNum大
Mul(iNum);
for (int i = 0; i < m - 1; i++) {
attData[i] = data[i];
}
Mul(jNum);
flag = "-";
} else if (iNum > jNum) {
// jNum大
Mul(jNum);
for (int i = 0; i < m - 1; i++) {
attData[i] = data[i];
}
Mul(iNum);
} else {
data[1] = 0;
}
int i;
for (i = 1; i < data[0]; i++) {
subStart(i);
}
add_carry_to_data();// 将进位数组加至和数组
adj_total();// 调整总位数
clear_carry();// 清0进位数组,准备下一次阶乘
// -86280才是对的
System.out.print(flag);
for (i = data[0]; i >= 1; i--) {
System.out.print(data[i]);
}
System.out.println();
init();
}
static void subStart(int i)// i:当前乘的位数 M-1>= i >=1; iNum:当前的阶乘子
{
// 6
// -120
int iTotal = data[i] - attData[i];// 当前的总数
if (iTotal < 0) {
data[i] = 10 + iTotal;
adj_carry(i + 1, -1, carry);// 调整进位数组
} else {
data[i] = iTotal;
}
}
static void addStart(int i)// i:当前乘的位数 M-1>= i >=1; iNum:当前的阶乘子
{
int iTotal = attData[i] + data[i];// 当前的总数
data[i] = iTotal % 10;
if (iTotal >= 10) {
adj_carry(i + 1, iTotal / 10, carry);// 调整进位数组
}
}
public static void main(String[] args) {
Mul(5, true);
Mul(3, true);
sub(3, 5);
sub(5, 3);
add(3, 5);
}
}