例1.有四个数字:1,2,3,4,能组成多少个互不相同且无重复数字的三位数,各是多少?
for语句语法规则如下:
for i = 初值:增量:终值;
语句1
...
语句2
end;
如果省略的增量则默认增量为1。
matlab代码如下:
clear all; %清除当前工作空间中的所有变量
clc; %清屏(清除命令窗口所有文本输出)
n=1;
for i=1:4; %百位 从1-4循环
for j=1:4; %十位 从1-4循环
for k=1:4; %个位 从1-4循环
number(n,:)=[i,j,k]; %{赋值+创建数组 这是一个数组赋值 语句,即将循环得到的一组i,j,k值存入第n行。同时通过这个赋值语句,matlab会自动创建这个数组并分配适当的大小。%}
n=n+1; %新增一行(每个数字组合存储为一行)
end
end
end
%{此时number数组中存在着一系列可能的三位数
%接下来的代码逐个检查数组元素,判断百位、十位、个位数字是否有重复
%因为删除行之后,数组的大小会改变,为了避免跳过元素,要从末尾开始倒序遍历
%在正向循环时,如果删除了当前行,后面的元素会向前移动,导致下一个访问的元素会被跳过。例如有一个3×4的矩阵,假设第二行满足条件,需要被删除。删除后原第三行成了现在的第二行,原第四行成了现在的第三行,那么下一个访问的就是现第三行(原第四行),而非预期的原第三行。%}
for m=n-1:-1:1 %因为n=n+1,所以到444后,n会自动多加一行
if(number(m,1)==number(m,2))||(number(m,1)==number(m,3))||(number(m,2)==number(m,3))
number(m,:)=[]; %如果一行中,有两个数字相等,则删除该行
end
end
num = number(:,1)*100+number(:,2)*10+number(:,3);%将三个数字转换为三位数,缺省了行,但仍会一一对应
for i = 1:length(num)
fprintf('%d\n', num(i)) % %{d表示输出整数,\n是换行符。(在 fprintf 函数中,格式字符串和变量的相对位置不会影响输出结果的格式。)%}
end