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();
}
}