例如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]}