2017-08-04 70 views
0

我開始用matlab,並試圖學習語言如何工作。查找n最大的自然數n!精確計算

我想解決如何找到最大的自然數n這樣n!是精確計算的。我被允許使用Matlab函數factorial和intmax。

我正在使用Matlab版本2017a。

非常感謝

+1

感謝您加入堆棧溢出!請回顧[如何問](https://stackoverflow.com/help/how-to-ask)! –

+0

這不就是最大'n',這樣'factorial(n)<= intmax'?你可以試着繼續計算'factorial(n)'直到它大於'intmax'。 – jodag

+1

實際上,從來沒有想過,大乘數因子會有大量尾隨零(包括二進制和十進制),因爲乘法中有很多2和10。這些值可能完全代表雙精度浮點數,因此您可能在MATLAB中完全代表大於intmax的幾個因子。 – jodag

回答

1

可能的解決辦法:

n=1; 
Vec=[1]; 
IsAccurate=true; 

while IsAccurate 
    n=n+1; 
    Vec(end+1)=n; %#ok<SAGROW> 
    Factorial=prod(Vec); %multiply all vector elements 
    IsAccurate=true; 
    for i=1:n %test if division of factorial by number give correct result 
     Number1=Factorial/Vec(i); 
     Number2=prod(Vec([1:i-1,i+1:n])); 
     Diff=Number1-Number2; 
     IsAccurate=IsAccurate & Diff==0; 
    end 
end 
disp(n) 
4

技術上講,你甚至都不需要使用factorialintmax功能來解決這個問題。下面是一個unsigned 64-bit integer type一個例子:

total = uint64(1); % Set the data type you want here 
N = 1; 
while (total == (total*(N+1))/(N+1)) 
    N = N+1; 
    total = total*N; 
end 
disp(N) 

和輸出:

20 % Largest N for uint64 types that gives correct factorial(N) 

這個工程由於數據類型有他們可以代表數的大小的上限。如果數字太大,最大值將會達到最大值integer types或丟失精度floating-point types(關於精度here的一些有趣的相關信息)。上面的循環保持運行total,其存儲的階乘高達N,並檢查是否乘以,然後除N+1給出相同的結果,如果初始乘法導致溢出/精度損失則不會。

+0

非常感謝。很有幫助。 –

+0

@Tom J如果回答這個問題,請標記爲已回答。 – jodag