关于MATLAB的一个程序算法

img


例如10进制的3位自恋数
153=1的三次方+5的三次方+3的三次方
用简单一点的函数及思想执行!
每一句进行解释!

函数

function [Nmat,Dmat] = Nacissitic( base,n )
% base进制,取值2-10
% n位数
% Nmat为base进制的自恋数,Dmat为自恋数对应的十进制取值
% Nmat和Dmat为[]时表示无解

Ns = ['1' repmat('0',1,n-1)];         % 初始判断数

jj = 1;
temp = 1;
Nmat = [];
Dmat = [];
while temp
    [flag,D] = Fun_Judge( Ns,base );  % 判断是否为自恋数
    if flag                           % 有解时保存结果
        Nmat{jj} = Ns;
        Dmat{jj} = D;
        jj = jj + 1;
    end
    
    for ii = n:-1:1    % 生成下一个判断数
        if str2num(Ns(ii))+1 < base
            Ns(ii) = num2str( str2num(Ns(ii))+1 );
            if ii~=n
                Ns(ii+1) = num2str( 0 );
            end
            if ii == 1       % 无解时
                temp = 0;
            end
            break;
        end
    end
end

end





function [flag,D2] = Fun_Judge( Ns,base )
% 判断base进制的Ns数是否为自恋数
% flag为是否自恋数的标识,D2为自恋数的十进制取值

n = length(Ns);
D1 = base2dec( Ns,base );
D2 = 0 ;
for ii = 1:n
    D2 = D2 + str2num(Ns(ii))^n;
end

flag = ( D1 == D2 );

end

结果验证:
3位十进制数

[Nmat,Dmat] = Nacissitic( 10,3 )

结果

Nmat =

  1×1 cell 数组

    {'153'}


Dmat =

  1×1 cell 数组

    {[153]}

4位十进制数

Nmat =

  1×1 cell 数组

    {'1634'}


Dmat =

  1×1 cell 数组

    {[1634]}

三位三进制数

Nmat =

  1×1 cell 数组

    {'122'}


Dmat =

  1×1 cell 数组

    {[17]}

三位八进制数

Nmat =

  1×1 cell 数组

    {'134'}


Dmat =

  1×1 cell 数组

    {[92]}