demo:
clc,clear,close all;
stID = '2020330361020';
x1 = zeros(1,length(stID));
for i = 1:length(stID)
x1(i) = str2double(stID(i)); %元素分割
end
x2 = unique(x1); %去重
restID(x2)
unique(restID(x1),'rows')
function y = restID(x) %全组合子函数
y = nchoosek(x,3); %实现组合的核心函数
end
示例1:
clc,clear,close all;
stID = '2020330361020';
x1 = zeros(1,length(stID));
for i = 1:length(stID)
x1(i) = str2double(stID(i)); %元素分割
end
disp("学号中的所有元素:")
x1
disp("去重后的元素:")
x2 = unique(x1) %去重
disp("全组合(3个一组):")
restID(x2)
function y = restID(x) %全组合子函数
y = nchoosek(x,3); %参数2表示几个一组合
end
结果1:
学号中的所有元素:
x1 =
2 0 2 0 3 3 0 3 6 1 0 2 0
去重后的元素:
x2 =
0 1 2 3 6
去重后的全组合:
ans =
0 1 2
0 1 3
0 1 6
0 2 3
0 2 6
0 3 6
1 2 3
1 2 6
1 3 6
2 3 6
示例2:
clc,clear,close all;
stID = '2020330361020';
x1 = zeros(1,length(stID));
for i = 1:length(stID)
x1(i) = str2double(stID(i)); %元素分割
end
disp("学号中的所有元素:")
x1
disp("去重后的元素:")
x2 = unique(x1) %去重
disp("去重后的全组合(3个一组):")
restID(x2)
disp("去重前的全组合(并剔除重复):")
unique(restID(x1),'rows') %由于去重前的学号里有重复元素,所以组合结果会有重复行,使用unique函数按行剔除重复组即可
function y = restID(x) %全组合子函数
y = nchoosek(x,3); %参数2表示几个一组合,可自定义修改
end
结果2:
学号中的所有元素:
x1 =
2 0 2 0 3 3 0 3 6 1 0 2 0
去重后的元素:
x2 =
0 1 2 3 6
去重后的全组合(3个一组):
ans =
0 1 2
0 1 3
0 1 6
0 2 3
0 2 6
0 3 6
1 2 3
1 2 6
1 3 6
2 3 6
去重前的全组合(并剔除重复组合):
ans =
0 0 0
0 0 1
0 0 2
0 0 3
0 0 6
0 1 0
0 1 2
0 2 0
0 2 1
0 2 2
0 2 3
0 2 6
0 3 0
0 3 1
0 3 2
0 3 3
0 3 6
0 6 0
0 6 1
0 6 2
1 0 0
1 0 2
1 2 0
2 0 0
2 0 1
2 0 2
2 0 3
2 0 6
2 1 0
2 1 2
2 2 0
2 2 1
2 2 2
2 2 3
2 2 6
2 3 0
2 3 1
2 3 2
2 3 3
2 3 6
2 6 0
2 6 1
2 6 2
3 0 0
3 0 1
3 0 2
3 0 3
3 0 6
3 1 0
3 1 2
3 2 0
3 3 0
3 3 1
3 3 2
3 3 3
3 3 6
3 6 0
3 6 1
3 6 2
6 0 0
6 0 2
6 1 0
6 1 2
6 2 0
使用到的相关函数官方手册教程:
unique函数:https://ww2.mathworks.cn/help/matlab/ref/double.unique.html?s_tid=doc_ta#d124e1504952
nchoosek函数:https://ww2.mathworks.cn/help/matlab/ref/nchoosek.html?s_tid=doc_ta
已解决问题全部情况,望采纳,有问题请留言,看到就回,简单的修改可以自行尝试调试,感谢合作!
function result=zuoye(a)
a=num2str(a);
n=length(a);
s=0;
for i=1:n
b=[a(1:i-1),a(i+1:n)];
x1=a(i:i);
for j=1:n-1
c=[b(1:j-1),b(j+1:n-1)];
x2=b(j:j);
for k=1:n-2
s=s+1;
x(s)={[x1,x2,c(k:k)]};
end
end
end
x=unique(x)
end
这种方法,是3位数任意排列,但没有重复(比如数字6,可以放在3前面,632,631……)
function result=zuoye(a)
a=num2str(a);
a=nchoosek(a,3);
n=length(a);
for i=1:n
x(i)={a(i,:)};
end
x=unique(x)
end
这种方法,是按序挑出3个数,原来选号中,6在3之后,那么排出来的数字,6也只能在3之后(631、632就不行)
这个很简单,排列组合问题,matlab里都有自带的函数,一搜就有
1、combntns(x,m)
列举出从n个元素中取出m个元素的组合。其中,x是含有n个元素的向量。
2、perms(x)
给出向量x的所有排列 (permutation)。
这题既然你都这么说了,那就不需要排列出所有结果了,123,213都一样,用第一个函数就行
3、unique(x)去除重复的元素。
你的作业要求里要写个app的界面,做一个输入框用于输入学号,一个输出框用于显示组合结果,把功能函数直接复制过去修改一下变量就可以了,app.x那种