回 帖 发 新 帖 刷新版面

主题:MATLAB的编程问题,急!!!

用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 楼

第七题:求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 楼

求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 楼

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 楼

怎么不能回复呀

15 楼

七:
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 楼

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 楼


>> 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 楼

>> 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 楼

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 楼

好久一段时间没来这论坛了,发现这里已经“面目全非”,惊讶的发现这个帖子居然这么热闹,
一时兴起,试着做下这些题目:

第一题:
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

我来回复

您尚未登录,请登录后再回复。点此登录或注册