如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/10 08:51:54
如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!
而且使得第2k个数等于其前后的两个数之和(第十四个数等于第十三个数和第一个数之和);
这个问题可以把它看成一个环,从不同的地方开环,会得到不同的数组,但数与数之间的相对位置还是相同的,该编程还要求剔除由于开环不同而得到的不同数组.
而且使得第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
再问: 试过了,不行呀!
再答: 你试过哪个?
我这两个都能运行
再问: 都行的,我昨天只直接地看到命令行窗口,忽视了结果。大神原谅!
%数列的偶数项的和正好是数列奇数项的和的两倍
%而偶数项和奇数项的和就是数列所有元素的和等于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
再问: 试过了,不行呀!
再答: 你试过哪个?
我这两个都能运行
再问: 都行的,我昨天只直接地看到命令行窗口,忽视了结果。大神原谅!
如何用Matlab语言编写在1~14的数中随机选14个互不相同的数!
请问:如何用Matlab语言编写在N个数中随机选m个互不相同的数!
用C语言编写有1,2,3,4四个数,能组成多少个互不相同且无重复数字的三位数,都是多少
如何用C语言产生30-40之间互不相同的56个随机小数,(说的是小数,小数点后三位~)
两个两位数字,它们各位数字互不相同,例如:12*63=21*36 如何用Java编程语言实现找出100以内所有的这些数!
用VB从1-12这12个数中随机生成3个互不重复的数
Matlab如何生成互不相同的随机整数
如何用MATLAB在一个向量中找出最大的数和它的位置,最大的数可能有多个.
在C语言中怎样用随机函数随机出奇数,和随机我我指定的一些数.
如何用C语言产生1-52的52个不同的数呀?
从54至199的整数中,各位数字互不相同的数有多少个?
MATLAB中,随机生成100个点,点间距离等于某个固定的数