我开始使用matlab,我正在尝试学习语言是如何运作的。
我正在尝试找出如何找到n的最大自然数n!是精确计算的。我被允许使用Matlab函数factorial和intmax。
我正在使用Matlab版本2017a。
非常感谢
答案 0 :(得分:4)
从技术上讲,您甚至不需要使用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
给出相同的结果,如果初始乘法导致溢出/精度损失,则不会。
答案 1 :(得分: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)