clear;clc;
data=[];
for i=1:9
for m=1:9
for n=1:9
S=m*10+n;
if rem(S,3)
for t=10:22
for tt=t^3;
temp=tt;
data=[data,temp];
end
end
end
end
end
end
data;
运行没有报错也不出结果,写迷糊了
代码存在的问题:
数据 = []; 因为没有在循环前赋值,所以数据始终为空。需要放在循环外先进行初始化。
for tt = t^3 应该是 for tt = t^3:99,因为4位数的范围是1000-9999,所以最大的立方数是99的立方,而不是22的立方。
rem(S,3) == 0 应该是 rem(str2double([num2str(m),num2str(n)]),3) == 0,因为需要判断的是后两位数字的和,而不是S本身是否为3的倍数。
改进后的代码:
数据 = []; for i = 1:9 for m = 0:9 for n = 0:9 if m == n S = str2double([num2str(m),num2str(n)]); if rem(S,3) == 0 for t = 10:99 tt = t^3; if tt >= 1000 && tt <= 9999 if str2double(num2str(tt(2:3))) == S 数据 = [数据,tt]; end end end end end end end end 数据;
其中 str2double([num2str(m),num2str(n)]) 将两个数字转化为字符串并拼接在一起,再将其转为数字用于计算。str2double(num2str(tt(2:3))) 取出第二位和第三位数字并组成另一个两位数,再将其转为数字用于判断是否为S。
四位数从1000-9999,可以这么做:
for num = 1000:9999
if mod(num, 10) == mod(floor(num/10), 10) % check if first two digits are the same
if mod(num, 3) == 0 % check if last two digits form a multiple of 3
if round(nthroot(num, 3))^3 == num % check if num is a perfect cube
disp(num)
break
end
end
end
end
你不需要4重循环来做
既然前2位相同,那你就从11到99循环,每次+11
后两位是3的倍数,那么后2位从00-99循环,每次+3
然后前两位x100+后两位就是这个4位数
开方转整型再平方如果还是原来的数就表示它是个完全平方数,也可以循环判断