【问题标题】:Whats wrong with my function code (MATLAB/OCTAVE)我的函数代码有什么问题(MATLAB/OCTAVE)
【发布时间】:2013-09-05 13:22:15
【问题描述】:

我正在努力使我的程序正常工作。它适用于素数。

下面是我的函数,然后是我的主程序

我相信这是正确的格式,(显然我可能错了,因为它不起作用),我一直在尝试修复它,但无济于事。任何帮助都将不胜感激,并且解释我做错了什么(我很确定它与微妙的格式有关)也会很棒。

function [answer,primefactors ] = primey1 (N)
for i=2:(N-1)
    A(i-1)=rem(N,i);
end
A;
if(all(A)==1)
    answer=['Yes']
    primefactors=[1,N]
elseif(all(A)==0)
    answer=['No']
    fac=[]
    for i=2:N
        q=0;
        while N/i==floor(N/i)
            N=N/i;
            q=q+1;
        end
        if q>0
            fac=[fac,i]
            if N==1
                break
                primefactors=[fac]
            end
        end
    end
end

endfunction

【问题讨论】:

  • 我使用的主程序函数是:N = 15485863; [答案,素数] = primey1(N); fprintf('%i 是素数吗?%s \n', N, answer) fprintf('%i 的素数是:\n' , N) fprintf('%i \n' , 素数)
  • 对于初学者来说很好......它的格式不正确
  • 你能解释一下这个:“cause it not working”更详细一点吗?您是否收到特定的错误消息?
  • 它想做什么?我不想试图解释代码在做什么并发现它有问题。
  • 我尝试了不同的方法来调整它,它说要么输出有错误(就好像输出不存在一样)。并且程序是确定值N是否是质数,如果是,它的质因数是什么。

标签: matlab function octave


【解决方案1】:

正如 Magla 所说,MATLAB 带有 primes 和 factor 函数,您至少可以使用它们来比较您的实现和/或检查您的结果。

不管怎样,至于你的代码,试试这个:

function [answer, primefactors] = primey1(N)

    % Use vectorization for simple cases such as these: 
    A = rem(N,2:N-1);

    if all(A)
        answer = 'Yes';
        primefactors = [1,N];

    % Re-wrote this entire section. There were a bunch of things wrong with it: 
    % the order of commands was wrong, variables were not assigned for some N, 
    % etc. Just compare the two implementations
    else
        answer = 'No';        
        primefactors = [];

        for ii = 2:N

            q = 0;            
            while N/ii == floor(N/ii)
                N = N/ii;
                q = q+1;
            end

            if q > 0
                primefactors = [primefactors,ii]; %#ok<AGROW>
                if N==1                   
                    break;
                end
            end

        end

    end

end

【讨论】:

  • 用问题中的代码“解决”问题的关键因素是理解为什么它声称输出未定义。正如 Rody 所展示的,这是因为您在 中断之后设置它。
【解决方案2】:

Matlab 有一个 factor 函数,可以执行您的代码尝试执行的操作

p = factor(10)

返回 2, 5 和

p = factor(11)

返回 11。

你所要做的就是测试length

if length(p) == 1

质数是true。

【讨论】:

    【解决方案3】:

    @Rody 提供的解决方案应该可以完成这项工作,理论上比这更有效,但是为了说明初始化的概念,我建议您在函数启动后立即初始化函数的输出变量。在您的情况下,这意味着我建议像这样开始代码:

    function [answer, primefactors] = primey1(N)
    % Function to determine whether a number is prime and which prime factors it has
    
    % Assign default values
    answer = 'No';
    primefactors = [];
    

    【讨论】:

      猜你喜欢
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      相关资源
      最近更新 更多