Wie kann man bei Exel durch eine bestimmte Zahl teilbare Zahlen markieren/rausfiltern?

"Bedingte Formatierung" => "Neue (oder Weitere) Regel(n)" => [Unterster Balken] - (Windows, Programm, Informatik)

3 Antworten

Ich habe dir mal zwei Funktionen geschrieben, mit denen du mit sehr großer Sicherheit (bei großen Zahlen keine 100%ige!) feststellen kannst, ob eine Zahl prim ist:

Function ISTPRIMFERMAT(ByVal iZuTestendeZahl As Long) As Boolean
  'Führt auf eine Zahl den Fermatschen Primzahltest durch und gibt
  ' zurück, ob der Test bestanden wurde.
  ' Es werden die Basen 2, 3, 5 und 7 getestet
  ' 03.11.2015 TH
  Dim a As Long
  
  ISTPRIMFERMAT = True
  Select Case iZuTestendeZahl
    Case 2, 3, 5, 7: Exit Function
  End Select
  If iZuTestendeZahl <= 7 Then
    ISTPRIMFERMAT = False
    Exit Function
  End If
  
  a = 2
  While a <= 7
    If iZuTestendeZahl Mod a = 0 Then
      ISTPRIMFERMAT = False
      Exit Function
    Else
      If aHochmModn(a, iZuTestendeZahl - 1, iZuTestendeZahl) <> 1 Then
        ISTPRIMFERMAT = False
        Exit Function
      End If
    End If
    
    If a <> 2 Then a = a + 1
    a = a + 1
  Wend
End Function

Private Function aHochmModn(ByVal a, m, n As Long) As Long
  aHochmModn = 1
  While m <> 0
    If m Mod 2 = 0 Then
      a = (a * a) Mod n
      m = m / 2 ' Typ Long!
    Else
      m = m - 1
      aHochmModn = (aHochmModn * a) Mod n
    End If
  Wend
End Function

Markiere den gesamten Bereich von A1 an und gibt dann in der Bedingten Formatierung diese Formel ein:

=REST(A1;2)=0

Wird das ein Sieb des Eratosthenes?

Mit der Funktion REST. 

Wenn die zu prüfende Zahl durch eine andere Zahl geteilt einen REST von 0 ergibt, dann kann man sie mit der bedingten Formatierung rot färben. 

Aber was muss ich da eingeben, damit der Term überhaupt erkannt wird? O.o      

Also, damit das Programm dann auch WEISS, dass es alles streichen soll, was durch 2 teilbar ist.

0
@Trummler

Deine Regel heißt REST(Zelle;2)=0 für die Teiler von 2, REST(Zelle;3)=0 etc. 

Für Primzahlen ist das Problem, dass du mit dieser Methode nicht voran kommst. Du kannst dir alle Zahlen, die durch 2 teilbar sind, anzeigen lassen. Von den nicht angezeigten nimmst du die kleinste (3). Das ist deine nächste Primzahl. Dann guckst du, welche weder von 2, noch von 3 markiert wurde. Das ist 5. Daher machst du die nächste Regel für die 5 etc.
Das Problem nun: Das basiert auf Primfaktorenzerlegung. Sprich: Jede Zahl lässt sich eindeutig in ein Produkt von Primzahlen zerlegen. Eine Zahl x ist natürlich nicht durch Zahlen, die größer als x teilbar sind dividieren. Wenn du also alle bisher gefundenen Primzahlen unter x markiert hast (das hast du garantiert, wenn x deine kleinste unmarkierte Zahl ist), und x noch nicht markiert ist, ist x eine Primzahl (sonst könnte sie ja weiter zerlegt werden). So findest du theoretisch jede Primzahl raus, ABER bei diesem Prinzip findest du jede Primzahl einzeln, nie mehrere gleichzeitig, d.h. du musst für JEDE Primzahl eine neue Regel festlegen.
Zum Glück hab ich ne (nicht 100% optimale) Lösung dafür q:
Nun könntest du schlau sein und dir wenigstens etwas Arbeit ersparen und nur für die Primzahlen bis 100x50 (also die Hälfte, 1 bis 5000) eine Regel erstellen, denn eine Zahl über 500 wird keine weiteren Zahlen mehr markieren, denn wenn du REST(Zelle;2)=0 als Regel hast, wird jede zweite Zahl markiert, bei REST(Zelle;3)=0 jede dritte und bei REST(Zelle;5003)=0 [keine Ahnung, ob die wirklich prim ist] jede 5003. Zahl. Nun heißt jede 5003. Zahl in 1 bis 10000 aber eigentlich nur die 5003 selbst, da 10006 schon nicht mehr im Bereich liegt.
5000 ist immer noch sehr viel, also vereinfachen wir weiter:
Gucken wir uns mal alle Zahlen über 200 an. Bspw. 203 [wieder keine Ahnung, ob wirklich prim]. Jetzt müssten wir 203, 2x203, 3x203 und 4x203 markieren. Die sind aber schon markiert! Waurm? Weil die ja auch durch 2/3/4 teilbar sind und dort markiert wurden.
Daher können wir generell sagen: Bei einer Zahl x sind alle Vielfachen bis 10000 bereits markiert, wenn der größtmögliche Faktor, bei dem das Ergebnis noch im Bereich 1 bis 10000 bleibt (also das maximale k für k*x<=10000), immer noch kleiner als das x ist.
D.h. wir haben k*x<=10000 und k<x
mit k maximal und x soll minimal sein (du willst ja so wenig wie möglich rechnen).
k<x |*k
k*k<k*x
und da k*x<=10000
gilt auch: k*k<10000 |Wurzel
k<100
Und da k maximal sein soll: k=99.
Da x minimal sein soll, nehmen wir aus k<x einfach x=100.
Zur Probe: k*x=99*100=9900<=10000.
Du musst also alle Primzahlen in den ersten 100 Zahlen herausfinden und markieren, dann hast du auch alle Primzahlen in den ersten 10000 Zahlen.
Verallgemeinert: Hast du alle Primzahlen bis x markiert, kennst du alle Primzahlen bis x². Andersherum: wenn du alle Primzahlen bis x wissen willst, musst du alle Primzahlen bis wurzel(x) herausfinden und markieren.
Warum ist das nicht optimal?
Naja, von der momentan größte Primzahl kann man sich nichtmal die Anzahl der Stellen irgendwie vorstellen (die Anzahl der Stellen hat Milliarden von Stellen). Mit diesem einfachen Algorithmus ist man schon begrenzt. Für eine Million Primzahlen bräuchte man per Excel und per Hand alle Primzahlen bis 1000 und für jede diese Markierungsregel. Viel Spaß dabei... ;)

1

Wer kennt eine spezielle Excel-Funktion in Bezug auf eingefärbte Zellen?

Hallo, ich brauche Hilfe bei einer Formel. Und zwar geht es um eine Reihe von Zahlen bei denen manche Zellen rot eingefärbt sind. Ich brauche eine Funktion die mir genau diese rot eingefärbten zahlen rauszieht oder auch gerne direkt addiert uns ausgibt. Vielen Dank :)

...zur Frage

Wie kann man schnell und leicht die Primzahlen auswendig lernen?

Heey!! Wie kann ich am schnellsten und am leichtesten die Primzahlen auswendig lernen?? Brauche ich für morgen... Mathe...achso..Primzahlen sind zahlen die nur durch zwei zahlen teilbar sind also durch eins und durch sich selbst...daaanke schon im voraus...

...zur Frage

drei aufeinanderfolgende Zahlen durch 3 teilbar.

Hallo liebe Community,

wenn man z.B. 3+4+5= 12 rechnet, kann man die Zahl durch 3 teilen. Das ist auch in anderen Fällen so (1543+1544+1545/3= 1544). Einen Term dazu habe ich schon: x+(x+1)+(x+2)=3x+3=3(x+1)

Trotzdem habe ich nicht verstanden, wieso das so ist.

Ich hoffe, dass jemand mir weiterhelfen kann :)

...zur Frage

Für was braucht man Primzahlen im Leben?

Wer braucht Primzahlen in Mathe ( Zahlen nur durch sich und 1 teilbar) ??? Warum lernt man sowas????

...zur Frage

Mit Java Daten zu MySQL Datenbank hinzufügen

Ich habe ein Programm geschrieben, das Primzahlen errechnet. Ich würde diese nun auch gerne in einer MySQL Datenbank abspeichern, weiß aber nicht genau wie ich das anstellen soll (eigentlich habe ich überhaupt keine Ahnung :) ).

Hier das ursprüngliche Programm:

public class Primzahlen {
 public static void main (String[] args) {
  double d1;
  int[] p;
  p = new int[350000000];
  p[0] = 2;
  int a = 0;
  System.out.print("2, ");

  for(int Zahl = 3; Zahl < 2000000000; Zahl++) {

   for(int  b = 0; b < 2000000000; b++) {
    d1 = (double) Zahl/p[b];
    int i1 = (int) d1;
    //System.out.println(d1-i1 + "  Ergebnis " + Zahl+ "/" + p[b] + ": " + d1 + "  Zahl: " + Zahl + "  Divisor:  " + p[b] + "    " + p[0] + p[1] + p[2] + p[3]);

    if ((d1 - i1) == 0.0) {
     //System.out.println(Zahl + " ist keine Primzahl, sie ist durch " + p[b] + " teilbar.");
     break;
    } else {
     if((p[b]*p[b]) > Zahl) {
      System.out.print(Zahl + ", ");
      a++;
      p[a] = Zahl;
      break;

     }
    }
   } 
  }
 }
}

Und hier mein kläglicher Versuch die Zahlen in der Datenbank zu speichern:

import java.sql.Connection;
public class Primzahlen {
 public static void main (String[] args) {
  Connection con = DriverManager.getConnection("jdbc:mysql://localhost:4001?user=schueler&password=0");
  stmt = con.creatStatement();

  double d1;
  int[] p;
  p = new int[1000];
  p[0] = 2;
  int a = 0;
  System.out.print("2, ");

  for(int Zahl = 3; Zahl < 2000; Zahl++) {

   for(int  b = 0; b < 2000; b++) {
    d1 = (double) Zahl/p[b];
    int i1 = (int) d1;
    //System.out.println(d1-i1 + "  Ergebnis " + Zahl+ "/" + p[b] + ": " + d1 + "  Zahl: " + Zahl + "  Divisor:  " + p[b] + "    " + p[0] + p[1] + p[2] + p[3]);

    if ((d1 - i1) == 0.0) {
     //System.out.println(Zahl + " ist keine Primzahl, sie ist durch " + p[b] + " teilbar.");
     break;
    } else {
     if((p[b]*p[b]) > Zahl) {
      System.out.print(Zahl + ", ");
      a++;
      p[a] = Zahl;
      stmt.executeQuery(INSERT INTO schueler_primzahlen.primzahlen (Primzahl Nr. , Wert);
      VALUES (a, Zahl);


      break;

     }
    }
   } 
  }
 }
}

Ich wäre sehr froh, wenn jemand mich von den Qualen des "Herumprobierens" erlösen könnte.

...zur Frage

Was möchtest Du wissen?