以下是我解这个问题的代码,没写注释不好意思了。
需要说明的是,该算法是利用先求出1000!的结果,而后再查询其中一共包含多少个0的方法求解的。
算法比较笨,如果哪位哥们有更好的算法,还望不吝赐教。
import java.util.Arrays;
public class Test{
public static void main(String[] args)throws Exception{
int n = 1000;
String result = factorial(n);
int[] ints = toInts(result);
int num = 0;
for(int i : ints){
if(i == 0)
num++;
}
System.out.println(n+"!的结果是:"+result);
System.out.println(n+"!的结果中共有"+num+"个0。");
}
public static String factorial(int num){
String result = "1";
if(num == 0)
return result;
for(int i=1; i<=num; i++){
result = multiplier(result, (i+""));
}
return result;
}
public static String multiplier(String num1, String num2){
int[] result = new int[10];
int[] num1s = toInts(num1);
int[] num2s = toInts(num2);
for(int i=0; i<num2s.length; i++){
for(int j=0; j<num1s.length; j++){
int temp = num1s[j]*num2s[i];
if((i+j)>result.length-2){
result = Arrays.copyOf(result, (int)(result.length*1.5));
}
add(result, i+j, temp);
}
}
int j = result.length;
for(int i=result.length-1; i>=0; i--){
if(result[i] != 0){
break;
}
j--;
}
int[] newResult = new int[j];
for(int i=0; i<newResult.length; i++){
newResult[i] = result[i];
}
newResult = swort(newResult);
return intsToString(newResult);
}
public static void add(int[] result, int i, int temp){
if(temp>=10){
add(result, i, temp%10);
add(result, i+1, temp/10);
}
else{
if((result[i]+temp)>=10){
add(result, i+1, (result[i]+temp)/10);
result[i] = (result[i]+temp)%10;
}
else{
result[i] = result[i] + temp;
}
}
}
public static String intsToString(int[] ints){
StringBuilder strb = new StringBuilder();
for(int i : ints){
strb.append(i);
}
return strb.toString();
}
public static int[] toInts(String num){
char[] chars = num.toCharArray();
int[] ints = new int[chars.length];
int i = 0;
for(char c : chars){
ints[i] = (int)c-48;
i++;
}
return swort(ints);
}
public static int[] swort(int[] ints){
int[] newints = new int[ints.length];
for(int i=0,j=ints.length-1; i<ints.length; i++,j--){
newints[j] = ints[i];
}
return newints;
}
}