modulo



  • Hi, für den Kenner wahrscheinlich Sonnen klar. Ich weiß das Modulo vereinfacht gesagt den Rest berechnet. Ich möchte aber nun auch ausgeben wie oft die Division mit dem Divisor ohne Rest durchgeführt wurde. Zum Beispiel 9/2= 4 Rest 1.
    Mein Programm soweit.

    #include <stdio.h>
    
    main()
    {
    	int div,dis,r;
    
    	//Frage warum funktioniert mit scanf() modulo nicht?????????
    
    	//printf("\nBitte geben Sie den Dividend ein\n");
    	//scanf("%i",&div);
    	div=4;
    
    	//printf("\nBitte gebne Sie den Divisor ein\n");
    	//scanf("%i",%dis);
    	//getchar();
    	dis=2;
    
    	if(div!=0)
    	{
    		r = div % dis;
    		printf("\nDer Rest beträgt %i\n",r);	
    	}
    	else 
    	{
    		printf("\nDer Nenner muss ungleich 0 sein\n");	
    	}
    
    	getchar();
    
    }
    

    Danke Senzi



  • Weil Du mit int s rechnest kannst Du die Division einfach durchführen und erhältst Deine Antwort (Zeile 17).

    #include <stdio.h>
    
    int main( void )
    {
      int div,dis,r;
    
      printf("\nBitte geben Sie den Dividend ein\n");
      scanf("%i",&div);
    
      printf("\nBitte gebne Sie den Divisor ein\n");
      scanf("%i",&dis);
    
      if(dis!=0)
        {
          r = div % dis;
          printf("\nDer Rest beträgt %i\n",r);
          printf("Die Division ist %i-mal moeglich ohne Rest.\n", div/dis);
        }
      else
        {
          printf("\nDer Nenner muss ungleich 0 sein\n");
        }
    
      getchar();
    }
    

    Ein paar Änderungen habe ich noch vorgenommen. Zeilen: 3, 11, 13. Klar, was und warum?



  • Dann nimm doch einfach die (Integer)-Division:

    int q;
    q = div % dis;
    

    Zu Zeile 14 (falls du das mit "Frage warum funktioniert mit scanf() modulo nicht" meinst):
    scanf erwartet als erstren Paramter einen Formatstring. In diesem String fangen die Formatspecifier mit % an. Als weiter Parameter erwartet scanf die Adressen, wo die Werte gespeichert werden. Adressen von Variablen bekommt man i.A mit dem Adressoperator &.
    In Zeile 10 hast du da doch auch richtig gemacht.
    Es ist auch gut, mal die Eingaben zur Kontrolle nochmal auszugeben:

    printf("\nDie Ganzzahldivision von %d /%d = %d Rest %d\n", div, dis, div / dis, div % dis );
    


  • 😡 Quatsch geschrieben
    Dann nimm doch einfach die (Integer)-Division:

    int q;
    q = div / dis;	// Division ist /
    


  • Besser noch: du verwendest div.
    Damit bekommst du Quotient und Rest mit einem Befehl und bei x86 schneller, da auf Assembler Ebene Division und Modulo gleichzeitig ausgeführt werden (wenn es nicht schon vom Compiler so optimiert wurde).



  • Youka schrieb:

    Besser noch: du verwendest div.

    Hab ich noch nie in Code gesehen und werde ich auch nie sehen. Das kann jeder Compiler selbst rausfinden.



  • divvv schrieb:

    Youka schrieb:

    Besser noch: du verwendest div.

    Hab ich noch nie in Code gesehen und werde ich auch nie sehen. Das kann jeder Compiler selbst rausfinden.

    Das ist aber nur die halbe Wahrheit.

    void print1(int x,int base){
    	if(x>=base)
    		print1(x/base,base);
    	putchar(x%base+'0');
    }
    void print2(int x,int base){
    	div_t d=div(x,base);
    	if(x>=base)
    		print2(d.quot,base);
    	putchar(d.rem+'0');
    }
    

    Er erkennt nix. gcc -O3 -march=native

    Trotzdem habe ich keine Lust, nachzuschauen, wie div geht und verlasse mich wie Du auf den Compiler. Es reicht, an den div-Trick zu denken, dann rafft's der Compiler auch.

    void print3(int x,int base){
    	int quot=x/base;
    	int rem=x%base;
    	if(x>=base)
    		print3(quot,base);
    	putchar(rem+'0');
    }
    

    🤡


Anmelden zum Antworten