如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!而且使得第2k个数等于其前后的两个数之和(第十四个数等于第十三个数和第一个数之和);这个问题可以把它看成一个环,从不同的
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/09 00:57:05
如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!而且使得第2k个数等于其前后的两个数之和(第十四个数等于第十三个数和第一个数之和);这个问题可以把它看成一个环,从不同的
如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!
而且使得第2k个数等于其前后的两个数之和(第十四个数等于第十三个数和第一个数之和);
这个问题可以把它看成一个环,从不同的地方开环,会得到不同的数组,但数与数之间的相对位置还是相同的,该编程还要求剔除由于开环不同而得到的不同数组.
如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!而且使得第2k个数等于其前后的两个数之和(第十四个数等于第十三个数和第一个数之和);这个问题可以把它看成一个环,从不同的
%按照题目意思,数列的偶数项为前后奇数项的和
%数列的偶数项的和正好是数列奇数项的和的两倍
%而偶数项和奇数项的和就是数列所有元素的和等于105
%所以奇数项和是35,偶数项和是70
a=nchoosek(1:14,7);%从14个数中选取7个数
b=a(sum(a,2)==35,:);%选出满足和为35的组合,是奇数项7个的所有可能组合
p=perms(2:7);%2-7的全排列
n=size(p,1);%2-7全排列的数量
p=[ones(n,1),p]%第1列添上1
%这时候p就是1-7的全排列中剔除所有循环数序相同的排列
v=zeros(1,14);%v储存一个结果
out=[];%out储存所有结果
for ii=1:size(b,1) %遍历奇数项7个数的所有可能组合
O=b(ii,:); %取第ii个可能组合,将作为可能的奇数项
E=setdiff(1:14,O); %E=剩下的7个数,将作可能的偶数组合
for jj=1:n %遍历剔除循环的1-7全排列
OO=O(p(jj,:)); %确定一种排列的奇数项OO
EE=OO+OO([2:7 1]); %计算相邻奇数项的和得到偶数项EE
if isequal(E,sort(EE)) %如果E和排序后的EE一致,则数列符合条件
v(1:2:end)=OO; %OO填入奇数项
v(2:2:end)=EE; %EE填入偶数项
out=[out;v]; %保存符合条件的数列
end
end
end
得到的结果out是一个34x14的矩阵
34行表示可以找到符合条件的34个数列
每行的14个数,就是一组排列方式的14个数
下面是另一种算法,用栈记录填数,两个两个数地填入数字
得到的结果也是34x14的矩阵,互相引证结果的正确性
%明显数字1只能出现在奇数项%因为要剔除其他循环相同的结果,限定1填在第一位
s=[ones(13,1),(14:-1:2)',zeros(13,12)];
%s为记录填数的堆栈,其中为0的位置表示未填数
%初始时s共有13行,第一列都为1,第二列为2-14
out=[];%储存结果
while ~isempty(s) %如果栈不空
now=s(end,:); %now为栈顶的s
s(end,:)=[]; %弹栈
n=nnz(now); %n为now中非零元素的个数
%也就是已填数字的个数
if n==14 %如果已经填满
if now(end)==now(end-1)+now(1);
%第14个数如果是第13个数和第1个数的和
out=[out;now];%符合条件,记录在out中
end
else %如果没填满
left=setdiff(1:14,now(1:n));%找出未填的数字
new1=now(n)-now(n-1);%计算下一个位置应该填的数字
if ~isempty(find(left==new1,1));%如果该数字可选
left(left==new1)=[]; %选出该数字
for ii=1:length(left)
new=now;
new([n+1 n+2])=[new1 left(ii)];%填入该数字和下一个数字
s=[s;new];%将增加了两个数字的序列入栈
end
end
end
end