1

プロジェクト Euler の問題 23 をゆっくりと進めていますが、問題が発生しました。問題#23は、2つの豊富な数によって作成できないすべての数の合計を見つけようとすることを含みます.

まず、私のコードは次のとおりです。

function [divisors] = SOEdivisors(num)
%SOEDIVISORS This function finds the proper divisors of a number using the sieve
%of eratosthenes


%check for primality
if isprime(num) == 1
    divisors = [1];


%if not prime find divisors
else
    divisors = [0 2:num/2]; %hard code a zero at one.

    for i = 2:num/2
        if divisors(i) %if divisors i ~= 0

            %if the remainder is not zero it is not a divisor
            if rem(num, divisors(i)) ~= 0

                %remove that number and all its multiples from the list
                divisors(i:i:fix(num/2)) = 0;
            end
        end
    end

    %add 1 back and remove all zeros
    divisors(1) = 1;
    divisors = divisors(divisors ~= 0);
end
end

この関数は豊富な数を見つけます

function [abundantvecfinal] = abundantnum(limitnum)
%ABUNDANTNUM creates a vector of abundant numbers up to a limit.


abundantvec = [];

%abundant number count
count = 1;

%test for abundance
for i = 1:limitnum

    %find divisors
    divisors = SOEdivisors(i);

    %if sum of divisors is greater than number it is abundant, add it to
    %vector
    if i < sum(divisors)
        abundantvec(count) = i;
        count = count + 1;
    end


end

abundantvecfinal = abundantvec;
end

そして、これがメインスクリプトです

%This finds the sum of all numbers that cannot be written as the sum of two
%abundant numbers and under 28123

%get abundant numbers
abundant = abundantnum(28153);

%total non abundant numbers
total = 0;

%sums
sums = [];

%count moves through the newsums vector allowing for a new space for each
%new sum
count = 1;

%get complete list of possible sums under using abundant numbers under
%28123 then store them in a vector
for i = 1:length(abundant)
    for x = 1:length(abundant)

        %make sure it is not the same number being added to itself
        if i ~= x
            sums(count) = abundant(i) + abundant(x);
            count = count + 1;
        end
    end
end

%setdiff function compares two vectors and removes all similar elements
total = sum(setdiff(1:28153, sums));


disp(total)

最初の問題は、間違った答えを教えてくれることです。正しい適切な除数と正しい豊富な数を取得していることはわかっているので、問題はおそらくメイン スクリプトにあります。そして、それはほぼ確実に豊富な金額の創造にあるようです。私が見つけられなかったエラーを誰かが見つけてくれることを願っていました。

さらに、複数の for ループが原因でコードが遅くなるため、このような問題をより効率的に行う方法も探しています。

ありがとう!

4

1 に答える 1

1

まあ、コメントするだけの評判はありません。同じ数をそれ自体に追加することを除外するのはなぜですか? 問題文は、例として 12+12=24 を示しています。

また、x が i より小さくなければならない理由もわかりません。同じ 2 つの数値を 2 回合計する必要はありません。

于 2013-10-12T18:30:32.653 に答える