您的位置:首页 > 其它

大数的相乘--用int数组做

2013-08-28 15:07 190 查看
import java.util.ArrayList;

import java.util.List;

public final class Demo

{

/**

* 计算n的阶乘最后一位非零数字<br>

* 输入值非法时返回-1

*

* @param n 需要计算阶乘的数字(0<n<200000000)

* @return int n!最后一位非0数字

*

*/

public int count(int n)

{

if(n > 0 && n < 200000000)

{

int[] a = convertInt(n);

List<int[]> list2 = new ArrayList<int[]>();

for (int i = 1;i < n; i++)

{

int[] b = convertInt(n-i);

if (i == 1)

{

list2.add(mul(a,b));

}

else

{

list2.add(mul(list2.get(i-2),b));

}

}

int length = list2.get(list2.size()-1).length;

int[] answer = new int[length];

answer = list2.get(list2.size()-1);

for (int m = 0;m < length;m++)

{

if(answer[length-1-m] != 0)

{

System.out.println(answer[length-1-m]);

System.out.println(toString(answer));

return answer[length-1-m];

}

}

}

System.out.println("error!n不符合要求");

return -1;

}

// int数组乘以int数组

public int[] mul(int[] a1, int[] b1)

{

List<int[]> list = new ArrayList<int[]>();

for (int i = 0;i < b1.length;i++)

{

int[] num = new int[a1.length];

for(int k=0;k<a1.length;k++)

{

num[k]=a1[k];

}

if(i == 0)

{

list.add(mul(num,b1[b1.length-1]));

}

if (i > 0)

{

list.add(moveInt(mul(num,b1[b1.length-1-i]),i));

}

}

List<int[]> list1 = new ArrayList<int[]>();

if (null != list && !list.isEmpty())

{

for (int i = 0;i < list.size();i++)

{

if (i == 0)

{

list1.add(add(new int[1],list.get(i)));

}

else

{

list1.add(add(list1.get(i-1),list.get(i)));

}

}

return list1.get(list1.size()-1);

}

return null;

}

// int数组乘以int

public int[] mul(int[] a2, int b2)

{

int firstDigit = 0;

for(int i = a2.length -1;i >= 0;i--)

{

int ride = a2[i] * b2;

if(ride < 10)

{

a2[i] = ride;

}

else

{

if(i == 0)

{

if(ride > 9)

{

a2[0] = ride % 10;

firstDigit = ride / 10;

}

else

{

a2[0] = ride;

}

}

else

{

a2[i-1] = a2[i-1] + ride / 10;

a2[i] = ride % 10;

}

}

}

if(firstDigit != 0)

{

int[] newAry = new int[a2.length + 1];

newAry[0] = firstDigit;

System.arraycopy(a2, 0, newAry, 1, a2.length);

return newAry;

}

else

{

return a2;

}

}

// 对int数组进行加运算

public int[] add(int[] a3, int[] b3)

{

int[] min = a3;

int[] max = b3;

if(max.length < min.length)

{

int[] temp = max;

max = min;

min = temp;

}

int firstDigit = 0;

for(int i = min.length - 1, j = max.length - 1; i >= 0; i--, j--)

{

int sum = min[i] + max[j];

if(sum < 10)

{

max[j] = sum;

}

else

{

if(j == 0)

{

if(sum > 9)

{

max[0] = sum % 10;

firstDigit = sum / 10;

}

else

{

max[0] = sum;

}

}

else

{

max[j-1] = max[j-1] + sum / 10;

max[j] = sum % 10;

}

}

}

if(firstDigit != 0)

{

int[] newAry = new int[max.length + 1];

newAry[0] = firstDigit;

System.arraycopy(max, 0, newAry, 1, max.length);

return newAry;

}

else

{

return max;

}

}

// 把int转化为int数组

public int[] convertInt(int n1)

{

String num1 = "" + n1;

int[] intArray = new int[num1.length()];

for (int i = 0;i < num1.length();i++)

{

intArray[i] = Integer.parseInt(num1.substring(i, i+1));

}

return intArray;

}

// 对int数组进行左移操作

public int[] moveInt(int[] a4,int i)

{

int[] b4 = new int[a4.length+i];

for (int j = 0;j < a4.length;j++)

{

b4[j] = a4[j];

}

return b4;

}

// 把int数组转化为String

public String toString(int[] ary)

{

if(ary == null || ary.length == 0)

{

return "0";

}

String sb = "";

for(int i = 0;i < ary.length; i++)

{

sb+= ary[i];

}

return sb.toString();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: