我是一位八度初学者,想要计算一个数字的所有整数除数,例如,对于数字 120,我想要得到 1, 2, 3, 4, 5, 6, 8, 10, 12 、15、20、24、30、40、60 和 120。
我知道八度有
factor
函数,但这只能给出素因数分解。我想要所有的整数除数。
我认为没有内置函数可以实现此目的,因此您需要编写一个。由于每个因子都是主要因子子集的乘积,因此您可以使用一些内置函数来构建所需的结果。
function rslt = allfactors(N)
%# Return all the integer divisors of the input N
%# If N = 0, return 0
%# If N < 0, return the integer devisors of -N
if N == 0
rslt = N;
return
end
if N < 0
N = -N;
end
x = factor(N)'; %# get all the prime factors, turn them into a column vector '
rslt = []; %# create an empty vector to hold the result
for k = 2:(length(x)-1)
rslt = [rslt ; unique(prod(nchoosek(x,k),2))];
%# nchoosek(x,k) returns each combination of k prime factors
%# prod(..., 2) calculates the product of each row
%# unique(...) pulls out the unique members
%# rslt = [rslt ...] is a convenient shorthand for appending elements to a vector
end
rslt = sort([1 ; unique(x) ; rslt ; N]) %# add in the trivial and prime factors, sort the list
end
我想这就是您要找的人。 希望它有用。
function fact(n);
f = factor(n); % prime decomposition
K = dec2bin(0:2^length(f)-1)-'0'; % generate all possible permutations
F = ones(1,2^length(f));
for k = 1:size(K)
F(k) = prod(f(~K(k,:))); % and compute products
end;
F = unique(F); % eliminate duplicates
printf('There are %i factors for %i.\n',length(F),n);
disp(F);
end;'
以下是输出:
>> fact(12)
There are 6 factors for 12.
1 2 3 4 6 12
>> fact(28)
There are 6 factors for 28.
1 2 4 7 14 28
>> fact(64)
There are 7 factors for 64.
1 2 4 8 16 32 64
>>fact(53)
There are 2 factors for 53.
1 53
上面的解决方案建议先使用
N choose K
,然后使用unique
,但我们可以轻松直接地从质因数计算除数:
function x = divisors(n)
f = factor(n);
u = unique(f);
c = histc(f,u);
x = [1,u(1).^(1:c(1))].';
for ii = 2:length(u)
x = (x.*[1,u(ii).^(1:c(ii))])(:);
end
end
您可以添加一些 if/else 来管理特殊情况(n=0 或 n<0).
只需使用“除数”:
divisors(sym(120))
ans = (sym) [1 2 3 4 5 6 8 10 12 15 20 24 30 40 60 120] (1×16 matrix)