初來乍到,望高手指教!
原有解決n的階乘的方式--迭代,如果是大資料的話,迭代會吃掉大量記憶體,導致記憶體溢位;用平時的迭代解決n的階乘問題:在計算21的階乘時,結果已然為負數,超出整型資料表示範圍。計算34的階乘是,結果已然為0;
此段**將n的階乘問題解決,實現無限大數的階乘!(「無限」兩字有點牽強,數字太大是否導致記憶體溢位,暫未考慮)。解決方案:
1、資料的表示用字串
2、在計算資料相乘、相加時採用字串計算
a、將字串解析成字元陣列,利用數字字元-48獲得數值;
b、將字串按位取出,解析成數值型別;
public class factorial
//計算n的階乘所得的結果有多少位數
//result通過factorial(n)獲取
public int calfactorialtrialnum(string result)
//計算n的階乘所得結果末尾有多少個零
//result通過factorial(n)獲取
public int calfactorialtrialzeronum(string result) else
}return count;
}//用迴圈代替迭代,計算n的階乘的主體
public string factorial(int n)
string result = "1";
for (int i = 1; i <= n; i++)
return result;
}//此方法相當於 n!= n*(n-1)! 此時(n-1)! = str
public string calculate(int n, string str)
for (int j = arrstr.length - 1; j >= 0; j--) else
if (j == 0 && binary != 0)
}if (result.tostring().equals("")) else
numzero++;
}return result.reverse().tostring();
}//將兩個字串進行解析後求和
//result 表示 n = 123 當計算1即n的最高位時,1以下位數與目標字串的乘積之和
//temp 表示 n = 123 當計算1即n的最高位時,1與目標字串的乘積
public stringbuilder addstringtostring(string result, string temp) else
}if (length == result.length() && length == temp.length())
} else if (length == result.length()) else
} else if (length == temp.length()) else
}return resultbuilder;
}//當上面乙個函式中的兩個字串長度不一樣或有進製時呼叫下面的函式進行高位處理
private string addinttostring(int temp, string str) else
}if (temp != 0)
return builder.tostring();
}public static void main(string args)
}
N階乘末尾0的個數
輸入乙個正整數n,求n 即階乘 末尾有多少個0?比如 n 10 n 3628800,所以答案為2 輸入為一行,n 1 n 1000 輸出乙個整數,即題目所求要判斷末尾有幾個0就是判斷可以整除幾次10。10的因子有5和2,而在0 9之間5的倍數只有乙個,2的倍數相對較多,所以本題也就轉換成了求n階乘中...
n的階乘末尾有幾個0
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 這個問題很簡單,就是問你n的階乘末尾有幾個0?輸入第一行乙個整數t 1 t 100 代表測試組數 接下來t行,每行乙個數n 1 n 10 9 對於每組測試資料,輸出...
n的階乘末尾含0的個數
本博主曾被問過這樣乙個問題 求n的階乘中末尾含有多少個0。例如n 10,n 3628800,那麼n 末尾有兩個0。直接計算n 的值顯然不合適,因為n 數值太大,很容易溢位。而且這種無腦的計算方式,顯然不適合面試的時候裝nbility拿高薪offer。本博主當時被問這個問題的時候的第一反應就是 要相乘...