数字推算:三个人在路上看到一个四位数的号码,一个人只看到前两位是相同的,另一 个人看到后两位组成的数是 3 的倍数,最后一个人计算这个四位数是一个数的立方。请利用MATLAB实现确定这个数是多少

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;

运行没有报错也不出结果,写迷糊了

代码存在的问题:

  1. 数据 = []; 因为没有在循环前赋值,所以数据始终为空。需要放在循环外先进行初始化。

  2. for tt = t^3 应该是 for tt = t^3:99,因为4位数的范围是1000-9999,所以最大的立方数是99的立方,而不是22的立方。

  3. 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位数
开方转整型再平方如果还是原来的数就表示它是个完全平方数,也可以循环判断