主题:MATLAB的编程问题,急!!!
aiseno
[专家分:0] 发布于 2006-07-16 12:03:00
用MATLAB编写以下程序:
1、取任意整数,若是偶数,则用2除,否则乘3加1,重复此过程,直到整数变为1。
2、输入两个正整数m和n,求其最大公约数和最小公倍数。
3、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
4、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
5、一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
6、求出100-999范围内的水仙花数。所谓水仙花数即一个三位数,该数等于其各位数字的立方和。 如:153=13+53+33=1+125+27
7、找出1-10000范围内的完数。所谓完数即该数等于其真因数的和 如:28=1+2+4+7+14
8 、魔方矩阵magic(n)的特点是:其元素由1到nn的自然数组成,且每行、每列及两对角线上的元素之和均等于(n3+n)/2。求n=9时的魔方矩阵。并且,找到此矩阵中所有被7整除的元素,在其位置上标以1,其余位置标以0。求此矩阵。
9、100元钱换成零钱(包括50元、20元、10元、5元、2元和1元六种面值),共有多少种不同的换法?(如50*2,20+10*7+5*2,100*1等都是不同的换法)。
希望高手们及时给小弟答案,急!!!谢谢
回复列表 (共21个回复)
11 楼
scollen [专家分:50] 发布于 2006-07-25 13:00:00
第七题:求1--n内的完数
M文件件如下:
function y=wanshu(n)
%本程序用于求1-n内的完数.
c=0;
d=0;
geshu=0;
for i=1:n
k=fix(sqrt(i));%对i的平方根向零方向取整.
for j=2:k
if(mod(i,j)==0&&j~=(i/j))
c=c+j;
d=d+i/j;
continue %如果I可以整除J,则将J与I/J求和.完成后退出本次循环.
elseif(mod(i,j)==0&&i==(i/j))
c=c+j;
continue %如果求得的两个因数相同,即I=I/J,则只取一个.
%完成退出本次循环.
else
continue
end
end
f=c+d+1;
if(f==i)
fprintf('找到完数:\n');
f
geshu=geshu+1;
end
c=0;d=0;
end
geshu
输入:wanshu(10000)
结果:
找到完数:
f =
1
找到完数:
f =
6
找到完数:
f =
28
找到完数:
f =
496
找到完数:
f =
8128
geshu =
5
12 楼
scollen [专家分:50] 发布于 2006-07-25 13:03:00
求1-n 内的完数.及个数.
function y=wanshu(n)
%本程序用于求1-n内的完数.
c=0;
d=0;
geshu=0;
for i=1:n
k=fix(sqrt(i));%对i的平方根向零方向取整.
for j=2:k
if(mod(i,j)==0&&j~=(i/j))
c=c+j;
d=d+i/j;
continue %如果I可以整除J,则将J与I/J求和.完成后退出本次循环.
elseif(mod(i,j)==0&&i==(i/j))
c=c+j;
continue %如果求得的两个因数相同,即I=I/J,则只取一个.
%完成退出本次循环.
else
continue
end
end
f=c+d+1;
if(f==i)
fprintf('找到完数:\n');
f
geshu=geshu+1;
end
c=0;d=0;
end
geshu
wanshu(10000)
结果:
找到完数:
f =
1
找到完数:
f =
6
找到完数:
f =
28
找到完数:
f =
496
找到完数:
f =
8128
geshu =
5
13 楼
scollen [专家分:50] 发布于 2006-07-25 13:12:00
function y=wanshu(n)
%本程序用于求1-n内的完数.
c=0;
d=0;
geshu=0;
for i=1:n
k=fix(sqrt(i));%对i的平方根向零方向取整.
for j=2:k
if(mod(i,j)==0&&j~=(i/j))
c=c+j;
d=d+i/j;
continue %如果I可以整除J,则将J与I/J求和.完成后退出本次循环.
elseif(mod(i,j)==0&&i==(i/j))
c=c+j;
continue %如果求得的两个因数相同,即I=I/J,则只取一个.
%完成退出本次循环.
else
continue
end
end
f=c+d+1;
if(f==i)
fprintf('找到完数:\n');
f
geshu=geshu+1;
end
c=0;d=0;
end
geshu
14 楼
scollen [专家分:50] 发布于 2006-07-25 13:13:00
怎么不能回复呀
15 楼
scollen [专家分:50] 发布于 2006-07-25 13:13:00
七:
function y=wanshu(n)
%本程序用于求1-n内的完数.
c=0;
d=0;
geshu=0;
for i=1:n
k=fix(sqrt(i));%对i的平方根向零方向取整.
for j=2:k
if(mod(i,j)==0&&j~=(i/j))
c=c+j;
d=d+i/j;
continue %如果I可以整除J,则将J与I/J求和.完成后退出本次循环.
elseif(mod(i,j)==0&&i==(i/j))
c=c+j;
continue %如果求得的两个因数相同,即I=I/J,则只取一个.
%完成退出本次循环.
else
continue
end
end
f=c+d+1;
if(f==i)
fprintf('找到完数:\n');
f
geshu=geshu+1;
end
c=0;d=0;
end
geshu
16 楼
wbmatlabqq.com [专家分:0] 发布于 2009-08-23 16:00:00
A=magic(9);
>> A(mod(A,7)~=0)=0;
>> A(A~=0)=1
A =
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 1
1 1 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 1 0
0 0 0 1 0 0 0 0 1
17 楼
wbmatlabqq.com [专家分:0] 发布于 2009-08-23 16:05:00
>> D=0
D =
0
>> for n=1:10
Dn=(100)*1/2^n
D=D+Dn
end
Dn =
50
D =
50
Dn =
25
D =
75
Dn =
12.5000
D =
87.5000
Dn =
6.2500
D =
93.7500
Dn =
3.1250
D =
96.8750
Dn =
1.5625
D =
98.4375
Dn =
0.7813
D =
99.2188
Dn =
0.3906
D =
99.6094
Dn =
0.1953
D =
99.8047
Dn =
0.0977
D =
99.9023
>>
18 楼
wbmatlabqq.com [专家分:0] 发布于 2009-08-23 16:11:00
>> clear;
j=1;
for i=100:999
c=mod(i,10);
b=mod((i-c)/10,10);
a=mod((i-10*b-c)/100,10);
if i==(a^3+b^3+c^3)
M(1,j)=i;
j=j+1;
end
end
fprintf('100到999内的水仙花数是:\n');
for h=1:length(M)
fprintf('%d ',M(1,h));
end
fprintf('\n');
100到999内的水仙花数是:
153 370 371 407
>>
19 楼
wbmatlabqq.com [专家分:0] 发布于 2009-08-23 16:22:00
tuzishu(6)
f =
1
f =
1 1
f =
1 1 2
f =
1 1 2 3
f =
1 1 2 3 5
f =
1 1 2 3 5 8
>>
20 楼
永恒的回忆 [专家分:810] 发布于 2009-08-25 20:23:00
好久一段时间没来这论坛了,发现这里已经“面目全非”,惊讶的发现这个帖子居然这么热闹,
一时兴起,试着做下这些题目:
第一题:
function ans=number1(x)
i=0;
ans=[];
while x~=1
i=i+1;
if mod(x,2)==0
x=x/2;
else
x=x*3+1;
end
ans=[ans x];
end
第二题:
function ans=number2(m,n)
if m<0 || n<0
error('The argument must be positive! ')
end
ans.gcd=gcd(m,n);
ans.lcm=lcm(m,n);
第三题:
function ans=number3(str)
char=[97 122 65 90];
num=[48 57];
spc=32
ans.spc=0;
ans.char=0;
ans.num=0;
ans.other=0;
double_str=double(str);
for i=1:length(str)
xx=double_str(i);
if xx==spc
ans.spc=ans.spc+1;
elseif xx>=char(1) &&xx<=char(2) || xx>=char(3) &&xx<=char(4)
ans.char=ans.char+1;
elseif xx>=num(1) && xx<=num(2)
ans.num=ans.num+1;
else
ans.other=ans.other+1;
end
end
问题四:(n非常大的时候用通项公式比递推更有效)
function ans=number4(n)
ans=(((1+5^(1/2))/2)^n-((1-5^(1/2))/2)^n)/5^(1/2);
问题五:
function ans=function5(high,n)
if n==0
ans.long=0;
ans.high=nan;
return
end
ans.long=high;
ans.high=high/2;
for i=2:n
ans.long=ans.long+2*ans.high;
ans.high=ans.high/2;
end
问题6:
function ans=number6
ans=[];
for ixx=1:9
for iyy=0:9
for izz=0:9
if ixx^3+iyy^3+izz^3==100*ixx+10*iyy+izz
ans=[ans 100*ixx+10*iyy+izz];
end
end
end
end
问题7:
function ans=number7
ans=[];
for i=1:10000
if (sum(sub_number7(i))==i)
ans=[ans i];
end
end
function ans=sub_number7(x)
ans=1;
for i=2:x^0.5
if mod(x,i)==0
ans=[ans i x/i];
end
end
问题8:
一楼的大哥给出的解法已经是精简得不能再精简了,所以就不再做
问题9:
六楼的大哥给出的解法是最适合偷懒的人了,不需动脑问题就解决,且让人一看就懂,
可惜这种代码老板看了悲剧会发生的。同样蛮力法,改写成混合进制的一般做法,不
过无奈的是数组的操作比一群变量的操作的时间要都很多,导致时间超久。还是得动
下脑筋用下分支定界法,不然老板看了还是同样的悲剧。
function ans=number99
max_data=[100 50 20 10 5 2];
data=[0 0 0 0 0 0];
shuju=[1 2 5 10 20 50]'
ans=0;
while true
while data(1)<=max_data(1)
if data(1)+data(2)*2+data(3)*5+data(4)*10+data(5)*20+data(6)*50==100
ans=ans+1;
end
data(1)=data(1)+1;
end
[isExcced data]=carry(data,max_data);
if isExcced
return
end
end
%处理进位关系的子函数
function [isExceed data]=carry(data,max_data)
data(1)=0;
top=data(end);
for i=2:length(data)
if data(i)+1>max_data(i)
data(i)=0;
else
data(i)=data(i)+1;
break
end
end
if top~=0 && data(end)==0
isExceed=true;
else
isExceed=false;
end
我来回复