arrayelemente miteinander multiplizieren



  • Hallo Leutz, folgnedes Problem:

    wieso geht folgendes nicht:

    var=e[i]*e[y]*e[k];

    ist das allgemein so (was ich mir nicht vorstellen kann) oder kA kann ich nur zwei zähler verwenden?

    hier die aufgabe die ich in der praxis ned gebacken bekomme:

    ein array mit primfaktoren:

    jetzt will ich von 2*2*5*5

    haben 2, 2*2, 2*5, 2*5*5 etc eig kein problem nur wenn ich dann drei zähler habe funzt es ned.

    Würd mich echt freuen wenn ihr mir da helfen könntet.

    Vielen Dank



  • c progger schrieb:

    Hallo Leutz, folgnedes Problem:
    wieso geht folgendes nicht:
    var=e[i]*e[y]*e[k];

    ka. hab da zu wenig kontext.

    hier die aufgabe die ich in der praxis ned gebacken bekomme:
    ein array mit primfaktoren:
    jetzt will ich von 2*2*5*5
    haben 2, 2*2, 2*5, 2*5*5 etc eig kein problem nur wenn ich dann drei zähler habe funzt es ned.

    aha. du willst alle teiler anzeigen.
    da brauchste dann irgendwie was anderes, vermute ich. eigentlich brauchste bei 5 primfaktoren ne 5-bit-zahl un bei gesetzem bit nimmste den faktor und sonst nicht.
    statt eines arrays mit 5 mal ja/nein neme ich 5 bits aus einem int. das darf ich deswegen (ich gehe mal von unsigned aus), weil wenn ein unsigned int 32 bit hat, er maximal 31 primfaktoren (lauter zweien) haben kann, also ist das promfaktorenarray e[] maximal 32 ints lang.

    //ungetestet
    void zeigeAlleTeiler(int e[],int anzahl){
       int cs;//characteristischer string
       for(cs=0;(cs<<anzahl)==0;++cs){
          int produkt=1;
          int i;
          for(i=0;i!=anzahl;++i)
             if((cs&(1>>i))!=0)
                produkt*=e[i];
          printf("%d ",produkt);
       }
    }
    


  • #include <iostream.h>
    
    int main()
    {
        int x[3] = { 1, 2, 3 };
        int a = x[0] * x[1] * x[2]; // 1 * 2 * 3, nur ein bsp..
    	cout << a << endl;
    	return 0;
    }
    

    natürlich kann man 3 faktoren benutzen warum nicht?
    was für einen fehler bekommst du denn?



  • Also erstmal: Danke für eure schnellen Antworten, unglaublich hatte n. erwartet, dass vor morgen was kommt.
    Is echt toll wenn man sich mit Fragen auch noch zu dieser Zeit an dieses Forum wenden kann.

    hier mal der komplette code (etwas abgeändert um ihn zu "debuggen", wie im kommentar vermerkt)

    #include <stdio.h>
    #include <math.h>
    
    int main ()
    
    {
    
    int y=0,x=0,k=0, i=0, j=0,zahl=0,zahl_2=0,vareins=0, var=0,e[10], array [10]={2,3,5,7,11,13,17,19},array_2[100]; 
    
    printf ("Bitte geben sie die erste  Zahl ein\n");
    scanf ("%i", &zahl);
    printf ("Bitte geben sie die zweite Zahl ein\n");
    scanf ("%i", &zahl_2);
    
    array[8]=zahl;
    y=0;
    for (;j<1;j++)
    if (j!=1) {
    var=zahl;}
    else {var=zahl_2;}
    for (;var>1;y++)
    
    {                            
    
    if (var%array[i]==0)
    { var=var/array[i];
       e[y]=array[i];
    printf("%i\n", e[y]);
    i=0;      
    
                   }
    
    else if (i<10) {i++;}
                                  ;}
    y=0;
    i=0;
    k=y+1;
    x=y+2;
    
    array[i]=e[y]; //hier war vorher ne for-schleife, hab ich haber weggetan um schritt für schritt zu schauen wo der fehler liegt.
    i=i+1;
    array[i]=e[y]*e[k];
    i=i+1;
    array[i]=(e[y]*e[k]);
    i=i+1;
    array[i]=array[i]*e[x];
    printf("%i\n", array[i]);
    
    printf ("erfolgreich\n");
    getchar ();
    return 0;
    
          }
    


  • sorry für doppelpost:

    So hat das vorher ausgesehen (auch ne version ohne forschleife)

    #include <stdio.h>
    #include <math.h>
    
    int main ()
    
    {
    
    int y=0,x=0,k=0, i=0, j=0,zahl=0,zahl_2=0,vareins=0, var=0,e[10], array [10]={2,3,5,7,11,13,17,19},array_2[100]; //if more than 100 mistakes then look here.
    
    printf ("Bitte geben sie die erste  Zahl ein\n");
    scanf ("%i", &zahl);
    printf ("Bitte geben sie die zweite Zahl ein\n");
    scanf ("%i", &zahl_2);
    
    array[8]=zahl;
    y=0;
    for (;j<1;j++)
    if (j!=1) {
    var=zahl;}
    else {var=zahl_2;}
    for (;var>1;y++)
    
    {                            
    
    if (var%array[i]==0)
    { var=var/array[i];
       e[y]=array[i];
    printf("%i\n", e[y]);
    i=0;      
    
                   }
    
    else if (i<10) {i++;}
                                  ;}
    y=0;
    i=0;
    k=y+1;
    x=y+2;
    
    array[i]=e[y];
    i=i+1;
    array[i]=e[y]*e[k];
    i=i+1;
    array[i]=e[y]*e[k]*e[x];
    
    printf("%i\n", array[i]);
    
    printf ("erfolgreich\n");
    getchar ();
    return 0;
    
          }
    


  • sobald ich das dritte array element ansprechen will, kommt ne riesen zahl raus und das obwohl es initialisiert ist bzw nicht leer.



  • Hast dir echt einen grauenhaften Schreibstil angewöhnt 😮 😉
    Hab deinen Code erstmal in ne schönerer Form gebracht:

    #include <stdio.h>
    #include <math.h>
    
    int main ()
    {
      int y=0,x=0,k=0, i=0, j=0,zahl=0,zahl_2=0,vareins=0, var=0,e[10], array [10]={2,3,5,7,11,13,17,19},array_2[100];
    
      printf ("Bitte geben sie die erste  Zahl ein\n");
      scanf ("%i", &zahl);
      printf ("Bitte geben sie die zweite Zahl ein\n");
      scanf ("%i", &zahl_2);
    
      array[8]=zahl;
      y=0; //hast du schon gemacht :-)
      /*Schleife 1*/
      for (;j<1;j++)
        if (j!=1) {
          var=zahl;
        }
        else {var=zahl_2;}
    
      /*Schleife 2*/
      for (;var>1;y++)
      {
        if (var%array[i]==0)
        {
          var=var/array[i];
          e[y]=array[i];
          printf("%i\n", e[y]);
          i=0;
        }
        else if (i<10) {i++;}
        ;
      }
    
      y=0;
      i=0;
      k=y+1;
      x=y+2;
    
      array[i]=e[y]; //hier war vorher ne for-schleife, hab ich haber weggetan um schritt für schritt zu schauen wo der fehler liegt.
      i=i+1;
      array[i]=e[y]*e[k];
      i=i+1;
      array[i]=(e[y]*e[k]);
      i=i+1;
      array[i]=array[i]*e[x];
      printf("%i\n", array[i]);
    
      printf ("erfolgreich\n");
      getchar ();
      return 0;
    }
    

    Die erste Schleife läuft nur einmal durch, nämlich mit j=0, was dazu führt, dass "var" immer den Wert von "zahl" bekommt. Du kannst die Schleife auch ganz tilgen. Aber ich glaub, du hast deinen Code nur falsch kopiert.

    Deine 2. Schleife:
    Warum setzt du "i" immer wieder auf 0? Wenn du schon geklär hast, das die Zahl nicht durch 2 teilbar ist, musst du es nicht noch mal prüfen.
    Du hast einen weiteren Denkfehler in deinem Code, der mir auch nicht gleich aufgefallen ist. Du setz array[8]=zahl, damit deine 2 Schleife auch terminiert, falls die Zahl nicht durch die vorherigen Primzahlen teilbar ist. Vergisst dabei aber, das die Zahl zwar durch eine teilbar sein kann und trotzdem nicht 1 wird.
    Bsp:
    46 = 2 * 23
    Deine Schleife macht dann:
    46%2 == 0 -> var = 23
    23%2 != 0
    23%3 != 0
    23%5 != 0
    23%7 != 0
    23%11 != 0
    23%13 != 0
    23%19 != 0
    23%46 != 0
    dann greift es auf array[9] zu, du das ist nicht initalisiert -> Speicherzugriffsfehler oder deine Schleife läuft endlos weiter, weil y größer als 1 bleibt
    Darum füge deiner Bedingung "i<9" hinzu

    Desweiteren, kann es passieren, dass dein Ergebnisarray zu klein ist und ein Specherzugriffsfehler eintritt, wenn y auf 10 gesetzt wird.
    Bsp.:
    4096 ist 14 mal durch 2 teilbar

    Nun dein Schluss:
    Das Problem ist, dass du nicht sicher sein kannst, dass auf den Stellen e[0], e[1] und e[2] was gespeichert ist.
    Bsp.:
    var = 4;
    Die 2. Schleife macht daraus
    e[0] = 2; (dein y)
    e[1] = 2; (dein k)
    e[2] (dein x) bis e[9] verändert sie nicht.

    Bsp.:
    var = 23;
    Die 2. Schleife verändert e[1] bis e[9] nicht, setzt nur e[1] auf 23

    Hab noch nicht ganz verstanden, was der Schluss soll, willst du die Schritte der Zerlegung nachvollziehen?

    #include <stdio.h>
    #include <math.h>
    
    int main ()
    {
      int a, y, x, k, i, j=0,zahl=0,zahl_2=0,vareins=0, var=0,e[10], array [10]={2,3,5,7,11,13,17,19},array_2[100];
    
      /* ... */
    
      /*Schleife 2*/
      i=0; //find ich so schöner, weil man gleich sieht welchen Wert i hat
      for (y=0;i<9 && var>1 && y<10;y++) // && ist das logische UND -> ist wahr, wenn beide Bedingung wahr sind
      {
        if (var%array[i]==0)
        {
          var=var/array[i];
          e[y]=array[i];
          printf("%i\n", e[y]);
        }
        else i++;
      }
    
      //y hat noch die letzte Position im e-Array gespeichert
      a=0; //neue Variable, damit ich y behalten kann
      i=0;
      k=a+1;
      x=a+2;
    
      if (y>=0) array[i]=e[a];
      i=++;
      if (y>=1) array[i]=e[a]*e[k];
      i=++;
      if (y>=1) array[i]=(e[a]*e[k]);
      i=++;
      if (y>=2) array[i]=array[i]*e[x];
      printf("%i\n", array[i]);
    
      printf ("erfolgreich\n");
      getchar ();
      return 0;
    }
    

    Hoffe du hast es bis hierhin geschafft 🙂
    Dann würd ich dir noch eine andere Möglichkeit vorschlagen, um das Problem mit der Primfaktorzerlegung zu machen.
    Anstatt jede einzelnen der Faktoren in e zu speichern, speichere doch einfach, wie oft sie vorgekommen sind. Dazu müsstest du e vorher mit Nullen füllen und dann an der entsprechende Stelle einhochzählen.
    Bsp.: 4840 = 2*2*2*5*11*11 , dann sähe dein e so aus {3,0,1,0,2,0,0,0}, wenn du dann deinen Primzahlen array drüber legst und die selbe Zählvariable verwendest kannst du es auch zum Schluss Nachvollziehen.

    /*Statt der 3. Schleife*/
    int temp;
    int pos = 0;
    for ( i=0; i<9 && pos<100; i++ ){
      temp = e[i]; // damit das Ergebnisfeld nicht verändert wird
      while ( temp !=0 ) {
        array_2[pos] = array[i];
        if ( pos > 0 ) array_2[i] = array_2[i] * array_2[i-1];
        pos++;
      }
    }
    

    Außerdem wird so die Primfaktorzerlegungsschleife einfacher.

    /*statt deiner 2. Schleife*/
    for ( i=0; i<9; i++ ) e[i] = 0; // Schleife leermachen
    for ( i=0; i<9; i++ ){ //Primfaktorenzerlegung
      if (var%array[i]==0) {
        e[i]++;
        var = var/array[i];
      }
    }
    


  • Hallo!

    Erstmal vielen Dank für die umfangreiche und detailierte Antwort.

    Zu dem gesagten:

    Lol sry wusste ned dass das grauenvoll ist.

    ich setze i imma wida auf 0 damit die neue var dann auch wida auf 2 überprüft wird.

    Bsp.:

    var=zahl
    if (kein rest)
    var=var/array[i]

    dann wird die neue var wida getestet ob sie durch 2 teilbar ist

    (0 deswegen weil bei jeden durchlauf wida von vorne begonnen werden muss)

    Du hast einen weiteren Denkfehler in deinem Code, der mir auch nicht gleich aufgefallen ist. Du setz array[8]=zahl, damit deine 2 Schleife auch terminiert, falls die Zahl nicht durch die vorherigen Primzahlen teilbar ist. Vergisst dabei aber, das die Zahl zwar durch eine teilbar sein kann und trotzdem nicht 1 wird.
    Bsp:

    bitte erklär mir das eine noch mal.

    Mit dem part 2 wollte ich alle Teiler einer Zahl erstellen.

    (ich weiss es gibt da primitivere Methoden)

    Die Idee mit der Zählung hatte ich auch schon aba kA, finde den ansatz mit den drei zählern auch schön, wenn er nur klappen würde.... 😃

    Ich seh mir deine Tipps mal an, danke nochmal.



  • Hallo Leute, hab mich einfach mal daran gemacht das ganze neu und sauber zu coden, unter ausserachtlassung der tipps und meiner nicht absolut notwendigen zählervars.

    #include <stdio.h>
    #include <math.h>
    
    int main ()
    
    //Teilmermengenbestimmung
    {
    
    int a=1,y=0,x=0,k=0, i=0, j=0,zahl=0,zahl_2=0,vareins=0, var=0,e[10]={0,0,0,0,0,0,0,0,0}, array [10]={2,3,5,7,11,13,17,19},array_2[100]; 
    //Eingabe
    printf ("Bitte geben sie die erste  Zahl ein\n");
    scanf ("%i", &zahl);
    printf ("Bitte geben sie die zweite Zahl ein\n");
    scanf ("%i", &zahl_2);
    
    //Primfaktozerlegung, erhöht den wert von i um eins, checkt alle elemente durch ob sie Primfaktoren sind. Pf werden in ein array geschrieben, der zähler für das array 
    // ist y
    
    //Primfaktorgewinnung
    
    for (var=zahl;var>1;)
    
    {
    
          if (var%array[i]==0)
    
           {  /* if (y!=0)*/ {y=y+1;}
    	    var=var/array[i];
    
    		e[y]=array[i];	
                  printf ("%i\n", e[y]);
                  i=0;
    	}
    
                   else i++;
    
    }
    
    printf ("\n");
    
    for (;e[a]!=0;a++)
    printf ("%i\n", e[a]);
    
    	return 0; }
    

    Fazit: es funzt.
    Jedoch: Seht euch bitte mal die if Anweisung im Kommentar an, setze ich diese jedoch funzt gar nix mehr.

    Einziges Problem: Kan ich sie nicht setzen muss die erste array variable leer bleiben is zwar eig kein problem aba ne unschöne lösung



  • Mit array[9]=var; in der For-Schleife hab ich auch das "46"er-Problem gelöst.

    Egal wie hoch der Primfaktor ist, jetzt kann er auch angegeben werden.


Log in to reply