作业帮 > 综合 > 作业

如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!

来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/10 08:51:54
如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!
而且使得第2k个数等于其前后的两个数之和(第十四个数等于第十三个数和第一个数之和);
这个问题可以把它看成一个环,从不同的地方开环,会得到不同的数组,但数与数之间的相对位置还是相同的,该编程还要求剔除由于开环不同而得到的不同数组.
如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!
%按照题目意思,数列的偶数项为前后奇数项的和
%数列的偶数项的和正好是数列奇数项的和的两倍
%而偶数项和奇数项的和就是数列所有元素的和等于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
再问: 试过了,不行呀!
再答: 你试过哪个?
我这两个都能运行
再问: 都行的,我昨天只直接地看到命令行窗口,忽视了结果。大神原谅!