043 – Sub-String Teilbarkeit pandigitaler Zahlen

 

Die Zahl 1406357289 ist eine 0-9 pandigitale Zahl, da alle Ziffern von 0 bis 9 genau ein Mal vorkommen. Eine weitere interessante Eigenschaft ist, dass Teile dieser Zahl durch die ersten Primzahlen teilbar sind:

d2d3d4=406 ist durch 2 teilbar
d3d4d5=063 ist durch 3 teilbar
d4d5d6=635 ist durch 5 teilbar
d5d6d7=357 ist durch 7 teilbar
d6d7d8=572 ist durch 11 teilbar
d7d8d9=728 ist durch 13 teilbar
d8d9d10=289 ist durch 17 teilbar

Finde die Summe aller 0-9 pandigitaler Zahlen mit dieser Eigenschaft.

Lösung

Hier können wir mit verschachtelten Schleifen arbeiten und jeweils die gewünschte Eigenschaft testen.

clc
clear all
tic

format long g
summe = 0;
S1 = [1 2 3 4 5 6 7 8 9 0];
i2 = 1;
for i6 = 5:5:10
    d(6) = S1(i6);
    S2 = S1(S1 ~= S1(i6));
    for i4 = 1:9
        d(4) = S2(i4);
        if mod(d(4),2)
            continue
        end
        S3 = S2(S2 ~= S2(i4));
        for i7 = 1:8
            d(7) = S3(i7);
            S4 = S3(S3 ~= S3(i7));
            for i8 = 1:7
                d(8) = S4(i8);
                if mod(100*d(6)+10*d(7)+d(8),11)
                    continue
                end
                S5 = S4(S4 ~= S4(i8));
                for i9 = 1:6
                    d(9) = S5(i9);
                    if mod(100*d(7)+10*d(8)+d(9),13)
                        continue
                    end
                    S6 = S5(S5 ~= S5(i9));
                    for i10 = 1:5
                        d(10) = S6(i10);
                        if mod(100*d(8)+10*d(9)+d(10),17)
                            continue
                        end
                        S7 = S6(S6 ~= S6(i10));
                        for i5 = 1:4
                            d(5) = S7(i5);
                            if mod(100*d(5)+10*d(6)+d(7),7)
                                continue
                            end
                            S8 = S7(S7 ~= S7(i5));
                            for i3 = 1:3
                                d(3) = S8(i3);
                                if mod(100*d(3)+10*d(4)+d(5),3)
                                    continue
                                end
                                S9 = S8(S8 ~= S8(i3));
                                for i1 = 1:2
                                    d(1) = S9(i1);
                                    S10 = S9(S9 ~= S9(i1));
                                    d(2) = S10(i2);
                                    pandnum = 0;
                                    for j = 1:10
                                        pandnum = pandnum + 10^(10-j)*d(j);
                                    end
                                    summe = summe + pandnum;
                                end
                            end
                        end
                    end
                end
            end
        end
    end
end

summe
toc

Ergebnis: 16695334890
Rechenzeit: 0.010741

Eine elegantere Lösung wäre, alle Permutationen gleichzeitig zu testen. Dies braucht aber sehr viel Speicher und funktioniert daher nicht auf jedem Computer:

x = perms(0:9);
p = primes(17);
for i = 2:8
    x = x(mod(x(:, i)*100 + x(:, i+1)*10 + x(:, i+2), p(i-1)) == 0, : );
end
format long
sum(x * 10.^(9:-1:0)')

Ähnliche Artikel

Kommentar verfassen