Eine Zahl durch mehrere gleichzeitig dividieren



  • Hallo zusammen.
    Ich bin mir am c++ erlernen und habe wahrscheinlich eine Anfängerfrage.
    Gibt es eine Möglichkeit eine gewisse Zahl durch einen Bereich von Zahlen zu dividieren?
    Also ich habe zum Beispiel eine Zahl, welche ich durch jede einzelne Zahl, die in den Klammern steht, einfach die Zahlen im Bereich, in der Art wie, int Zahl geteilt durch (1-100) , dividieren will.
    Gibt es da eine Möglichkeit?
    Besten Dank für die Hilfe und Antworten.
    Freundliche Grüsse



  • Sagt dir der Begriff Schleifen etwas? Wenn ja, dann versuche es doch mal damit, ansonsten lies dir die Grundlagen durch.

    P.S. Achja, Array bzw std::vector<T> solltest du dir acuh mal ansehen.



  • Danke für die rasche Antwort. OK ich werde es mal mit Schleifen versuchen, ich dachte mir es gäbe eine elegantare Lösung, dass man einfach den Bereich angeben könnte. Wäre natürlich ideal gewesen.
    Besten Dank



  • Du willst wohl eher doubles oder floats und keine ints. Naja, das ist zumindest kurz:

    #include <numeric>
    #include <iostream>
    
    int main(){
        double nums[] = {1,2,3,4,5,6,7};
    
        std::cout << std::accumulate(nums, nums+7, 1.0, std::divides<double>()) << std::endl;
    }
    

    Einen array habe ich jetzt mal nur der einfachen Schreibweise (Initialisierung) wegen genommen.



  • Uhi Coole Sache, da habe ich wohl zu wenig in der Referenz gelesen. Man lernt ja nie aus 🙂



  • Besten Dank für die Antworten.
    Es tut mir leid, dass ich so viele (dumme) Fragen habe.
    Aber was muss ich noch ergänzen, dass der Code funktioniert?
    Und ehm..was macht er überhaupt genau?
    Danke, dass Ihr euch Zeit für mich nehmt.



  • Maethu schrieb:

    Besten Dank für die Antworten.
    Es tut mir leid, dass ich so viele (dumme) Fragen habe.
    Aber was muss ich noch ergänzen, dass der Code funktioniert?
    Und ehm..was macht er überhaupt genau?
    Danke, dass Ihr euch Zeit für mich nehmt.

    Das ist ein fertiges Programm..

    Hast du den schon etwas angefangen, oder überhaupt ein wenig Erfahrung im programmieren? Also schon mal etwas auf der Konsole ausgegeben?



  • Ja, ich habe erst gerade einen Zinsrechner programmiert.
    Immer wenn es um etwas neues geht habe ich einfach Schwierigkeiten dies sofort zu kapieren.



  • Ist natürlich die Frage was du überhaupt machen willst.

    Dein a / [1..100] entspricht ja a / 100! (also Fakultät von 100). Das macht nicht gerade viel Sinn da 100! schon die Möglichkeiten einfacher Datentypen locker sprengt. (Wobei zu beachten ist das in C++ die Fakultät manuell ausgerechnet werden muss, der !-Operator ist was anderes).

    Wenn du allerdings a durch die Summe aller Zahlen von 1 bis 100 rechnen willst, ist es wohl einfacher einfach durch 5050 zu teilen.

    Ansonsten:

    #include <numeric>
    #include <iostream>
    #include <vector>
    
    int main(){
        std::vector<double> nums;
        for(unsigned int i = 1; i <= 100; i++)
          nums.push_back(i);
    
        std::cout << std::accumulate(nums.begin(), nums.end(), 1.0, std::divides<double>()) << std::endl;
    }
    

    Das Ergebnis wird aber wie gesagt nicht besonders sinnvoll sein.



  • Maethu schrieb:

    Ja, ich habe erst gerade einen Zinsrechner programmiert.
    Immer wenn es um etwas neues geht habe ich einfach Schwierigkeiten dies sofort zu kapieren.

    Keine Bange. Das kommt schon noch.
    accumulate ist ein Standardalgorithmus. Normalerweise hier zu finden:
    http://www.cplusplus.com/reference/algorithm/

    accumulate ist da aber (zu meinem erstaunen und enttäuschung) nicht drauf.

    Versuch dich ruhig mal an der Schleifen Variante, um dich ein wenig mit der Sprache vertrauter zu machen. Später wirst du dann die Elegenz der Standardalgorithmen noch lieben lernen. 😉



  • Liegt vermutlich daran das accumulate in <numerics> liegt. Aber das scheint auf der Seite nicht behandelt zu werden.

    Sonst: http://www.cppreference.com/wiki/stl/algorithm/accumulate



  • Besten Dank
    Jetzt bin ich dran einen Primzahlrechner zu programmieren. Nur habe ich noch paar Denkprobleme, darum dachte ich mit dem Dividieren. Aber ich musste feststellen, dass dies nicht das Gewünschte ergeben wird, leider.



  • Ahhh.... sag das doch gleich.

    Was du also willst ist zB alle Primzahlen kleiner 100 herausfinden?

    Eine Möglichkeit ist es hierzu jede Zahl von 2 bis 100 durchzugehen.
    Für jede dieser Zahlen schaust du nun, ob sie durch irgend eine der Zahlen die kleiner sind teilbar ohne Rest ist (Modulo-Division). Ist eine dabei, ist es keine Primzahl. Sonst ist es eine.

    Mach aus den paar Sätzen Pseudo-Code und es geht dann wohl ganz schnell.



  • Ja also, man soll eine Zahl eingeben, und es sollen alle Primzahlen bis zur eingegebenen Zahl gefunden werden.
    Irgendwie habe ich immer wieder Anstösser, aber ich werde es einmal versuchen.



  • Ich habe jetzt mal paar Zeilen Code probiert. Nur habe ich ein Problem. Ich weiss, sicher eine noob Frage, aber wiso zählt er Hochzaehlen nie rauf? Und der Code mag vielleicht auch nicht schön sein, aber ich wollte ein eigenes Programm schreiben und es soll auch funktionieren. Desjalb..kann mir jemand auf die Sprünge helfen?
    Besten Dank

    // Primzahlrechner.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream.h>
    
    int main(int argc, char* argv[])
    {
    	int BisZahl;
    	int Primzahl;
    
    	cout << "Geben Sie die Zahl ein, bis zu der die Primzahlen gesucht werden sollen.\n";
    	cin >> BisZahl;
    	for (int Hochzaehlen = 3; Hochzaehlen <= BisZahl; Hochzaehlen++)
    	{	for (int BerechneZahl = 2; BerechneZahl <= Hochzaehlen; BerechneZahl++)
    		{
    			if (BerechneZahl == Hochzaehlen)
    			{
    				BerechneZahl = 2;
    			}
    			else
    			{
    				BerechneZahl = BerechneZahl;
    			}
    
    			if (Hochzaehlen % BerechneZahl == 0)
    			{
    				BerechneZahl = BerechneZahl;
    			}
    			else
    			{
    				Primzahl = Hochzaehlen;
    				cout << Primzahl << "\n";
    			}
    		}
    	}
    
    	return 0;
    }
    


  • Ahh, Eigeninitiative. Sieht man gern. 🙂

    Habs mal in CPP-Tags gepackt, liest sich besser als die ollen Code-Tags.

    // Primzahlrechner.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
    //
    
    //#include "stdafx.h" // am besten reine Konsolenanwendungen ohne Standardheader nehmen
    #include <iostream> // mit .h ist es veraltet
    
    using namespace std; // das erspart dir das nervige std:: vor allen Standardtypen-/Funktionen
    // aber in Headern sollte man std:: vor schreiben statt using zu verwenden
    
    int main(int argc, char* argv[])
    {
    	int BisZahl;
    	int Primzahl;
    
    	cout << "Geben Sie die Zahl ein, bis zu der die Primzahlen gesucht werden sollen.\n";
    	cin >> BisZahl;
    
    	for (int Hochzaehlen = 2; Hochzaehlen <= BisZahl; Hochzaehlen++)
    	{	
               for (int BerechneZahl = 2; BerechneZahl < Hochzaehlen; BerechneZahl++) // < statt <=
    		{
                        // ab hier verstehe ich nicht mehr was du vor hast
    			if (BerechneZahl == Hochzaehlen)
    			{
    				BerechneZahl = 2;
    			}
    			else
    			{
                                    // hier passiert gar nichts
    				BerechneZahl = BerechneZahl;
    			}
    
    			if (Hochzaehlen % BerechneZahl == 0)
    			{
                                    // hier passiert auch nichts
    				BerechneZahl = BerechneZahl;
    			}
    			else
    			{
    				Primzahl = Hochzaehlen;
    				cout << Primzahl << "\n";
    			}
    		}
    	}
    
    	return 0;
    }
    

    Also du solltest folgendes Versuchen:

    Für jede Zahl <= BisZahl gehst du erst einmal davon aus das sie Prim ist.
    Nun schaust du für jede kleinere Zahl > 1 ob die Modulodivision 0 ergibt. Ist dem der Fall wird die vorherige Annahme das die Zahl Prim ist auf false gesetzt. Nachdem du diese Modulodivisionen für alle Zahlen durchgeführt hast, schaust du ob die Zahl noch als prim markiert ist und gibst sie ggf. aus.

    Was bei dir momentan passiert ist a) merkwürdig 😃 und b) würde es schon reichen wenn eine Zahl durch irgend eine kleinere nicht teilbar ist. Dabei muss dies ja für alle gelten.



  • Danke, dass du immer schnell und verständlich antwortest 🙂
    also, von dem Punkt an, wo du mich nicht mehr verstehst ^^..
    Dort wollte ich BerechneZahl wieder auf 2 setzen und wollte eigentlich, dass Hochzaehlen immer um ein hinaufzählt, so dass BerechneZahl jede Zahl abchecken kann. Ich weiss, es ist kompliziert, ich habe meistens komplizierte Gedanken, aber wenn ich ein Gedanke hab, will ich es auch so vollenden 😃
    Aber weisst du, wiso dass Hochzaehlen nicht mit raufzählt nach jedem Durchgang? Er überspringt immer diesen äusseren for-Schlaufen Teil nach jedem Durchlauf. Wenn dies klappen würde, würde glaub ich meine komplizierte Version schon einigermassen funktionieren..^^
    Ja ich will lieber das Programm selber,aber ggf. mit Hilfe schreiben, wenn ich sonst den Code kopiere funktioniert's zwar, aber ich habe keine Ahnung was es macht und so lerne ich auch nichts...



  • Das liegt daran das du mit dem BerechneZahl = 2; beim letzten Durchlauf der inneren Schleife wieder von vorne anfängst.

    Wenn deine Schleifen so aussehen:

    for(int i = 0; i < 10; i++)
    for(int j = 0; j < i; j++)

    wie sie es bei dir ja in etwa tun, wird schon sichergestellt das es so durchläuft:
    i = 1, j = 0
    i = 2, j = 0
    i = 2, j = 1
    i = 3, j = 0
    i = 3, j = 1
    i = 3, j = 2
    i = 4, j = 0
    i = 4, j = 1
    i = 4, j = 2
    i = 4, j = 3

    usw.

    Du musst also weder i noch j verändern.


Log in to reply