我開始用matlab,並試圖學習語言如何工作。查找n最大的自然數n!精確計算
我想解決如何找到最大的自然數n這樣n!是精確計算的。我被允許使用Matlab函數factorial和intmax。
我正在使用Matlab版本2017a。
非常感謝
我開始用matlab,並試圖學習語言如何工作。查找n最大的自然數n!精確計算
我想解決如何找到最大的自然數n這樣n!是精確計算的。我被允許使用Matlab函數factorial和intmax。
我正在使用Matlab版本2017a。
非常感謝
可能的解決辦法:
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)
技術上講,你甚至都不需要使用factorial
或intmax
功能來解決這個問題。下面是一個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
給出相同的結果,如果初始乘法導致溢出/精度損失則不會。
非常感謝。很有幫助。 –
@Tom J如果回答這個問題,請標記爲已回答。 – jodag
感謝您加入堆棧溢出!請回顧[如何問](https://stackoverflow.com/help/how-to-ask)! –
這不就是最大'n',這樣'factorial(n)<= intmax'?你可以試着繼續計算'factorial(n)'直到它大於'intmax'。 – jodag
實際上,從來沒有想過,大乘數因子會有大量尾隨零(包括二進制和十進制),因爲乘法中有很多2和10。這些值可能完全代表雙精度浮點數,因此您可能在MATLAB中完全代表大於intmax的幾個因子。 – jodag