如何用matlab找到最小的自然数n,使其的组成数字满足同时等于其2倍(2*n),3 4 5和6倍的组成数字?(这里进一步解释说明下组成数字相同的含义是,比如123 132 213 231 321 312含有相同的组成数字,也就是说只要是1、2、3的排列组合即可)
可以从1开始一个数一个数来找,先得到每一位的数字然后判断所含数字是否相同。
tic;
i = 1;
while true
digits_original = unique(num2str(i),'sorted');%获得原数每一位数字并排序,结果是字符串
for times=2:7%依次计算2,3,4,5,6倍的数
digits = unique(num2str(i*times),'sorted');
if ~isequal(digits_original,digits) %判断字符串是否相等,不相等则该数不正确,跳过
break;
end
end
if times==7 %如果所有倍数的组成数字与原数相同,这找到答案,答案是142857
fprintf('The number is: %d\n',i);
break;
end
i = i+1;
end
toc;
答案是142857,有用请采纳,谢谢!
clear all
clc
% parfor是并行计算,当命令行窗口出现答案就可以手动停止程序了,因为parfor不支持return和break
parfor i=1:1e+6
nums1 = func(i);
nums2 = func(2*i);
nums3 = func(3*i);
nums4 = func(4*i);
nums5 = func(5*i);
nums6 = func(6*i);
if isequal(nums1,nums2)&&isequal(nums2,nums3)&&isequal(nums3,nums4)&&isequal(nums4,nums5)&&isequal(nums5,nums6)
i
end
end
function nums = func(i)
str = num2str(i);
len = length(str);
for j = 1:len
nums(j)=str2double(str(j));
end
nums=unique(nums);
nums = sort(nums);
end