Die Mathe-Redaktion - 18.12.2017 02:09 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
ListenpunktSchwätz / Top 15
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden oder den Newsletter bestellen.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 414 Gäste und 5 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C++: Funktion schreiben
Druckversion
Druckversion
Antworten
Antworten
Autor
Schule C++: Funktion schreiben
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2017-10-10

C++
void gt(); //größter kleiner teiler
void gt (int t){
   int z;
 for(z=3;z<=sqrt(t);z=z+2)
    {
        if(t%z==0){
        cout<<t<<" ";
        }
        else{
        cout<<z<<"";
        }
    }
}
 
Das hab ich als Funktion creirt. Sie will nicht ....

da sie nicht funktionierte habe ich sowas geschrieben:
C++
 for(z=3;z<=sqrt(x);z=z+2){
                    if (x%z==0  && prim(z)==true)

Das funktioniert. Ich möchte den Teil aber auslagern und in eine Funktion packen. Ich möchte die Primteiler als Rückgabe. Wenn ich die in einen Vector packe, habe ich darauf auch im Hauptteil Zugriff?



-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1214
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2017-10-10


Deine Fragen sind in der Form leider sehr schwer zu vertehen.


Intuitiv würde ich ja sagen, dass du genau die falschen Werte ausgibst.
Das ist allerdings geraten, da ich nicht verstehe, was die Funktion eigentlich machen soll.


Allgemein hilft es, sich Algorithmen zunächst einmal als Pseudocode aufzuschreiben und beim Implementieren ausführlich zu dokumentieren.




-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26072
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2017-10-10


Völlig unverständlich, da die verbale Beschreibung etwas ganz anderes suggeriert als die Implementierung erahnen läßt confused

Und die Creativität beim Erfinden neuer Begriffe und Schreibweisen ist unerreicht razz

Gruß vom ¼


-----------------
Bild



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, vom Themenstarter, eingetragen 2017-10-10


Also zur Ergänzung von Posting 1

ich hab mal im Minimal-Rahmen von C++ was möglichst Schickes formatiert. Die Ausgabe sieht so aus:



Durch ein p werden die PZ signalisiert. Daß ich das mal rot hinkriege in der Ausgabe, ist ein Fernziel.
Ich hätte jetzt gerne an den Stellen, wo kein p steht, die jeweiligen Primteiler.... dazu wollte ich die Funktion. Wie gesagt, mathematisch  und programmiermäßig hab ich das schon korrekt rausbekommen:

siehe hier: matheplanet.de/default3.html?topic=231350=51

ich hätte diese Funktion des Primteilersuchens gerne ausgelegt in eine c++ Funktion, und dann call by value








-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1214
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2017-10-10


Definiere möglichst präzise und ohne selbsterfundene Begriffe Eingabe und Ausgabe deiner Funktion oder deines Programms.


Bspw.:

Eingabe:
Eine natürliche Zahl N, die im Dezimalsystem auf 6 endet

Ausgabe:
Menge aller Paare natürlicher Zahlen A,B, die im Dezimlsystem auf 3 enden und für die A+B=N gilt;
Markiere A bzw. B falls Primzahl

Zukunftswunsch:
Ausgabe als html-Tabelle mit CSS-Klassenattributen


Ich habe keine Ahnung, ob es das ist, was du tun willst (und noch weniger, warum). Doch wenn du so etwas schreibst, kann man dir mutmaßlich helfen.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2017-10-10


2017-10-10 15:25 - DerEinfaeltige in Beitrag No. 4 schreibt:
Ausgabe:
Menge aller Paare natürlicher Zahlen A,B, die im Dezimlsystem auf 3 enden und für die A+B=N gilt;
Markiere A bzw. B falls Primzahl

Das will ich:
Drucke, bei A und B, falls keine PZ, die Primteiler.
Und zwar will ich das in einer ausgelagerten Funktion in C++!


Zum Zukunftswunsch: Ausgabe als html-Tabelle mit CSS-Klassenattributen
Was nützt mir HTML - ich will doch keine Web-Site machen?


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1214
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, eingetragen 2017-10-10


Kümmere dich zunächst um die Funktionalität und gib die Daten strukturiert in eine Datei aus.

Ich würde dabei zunächst beide Summanden zusammen mit der jeweiligen Faktorisierung ausgeben.

Bspw:
meineSinnloseFunktion(36) ->
3        [3]        33        [3,11]
13        [13]        23        [23]

Was du dazu benötigst sind im Wesentlichen
- ein Primzahlsieb
- eine Funktion zum Faktorisieren
- eine Funktion zur Datenausgabe
- eine Funktion, die die Eingabedaten damit verarbeitet

Formatieren kann man dann immer noch.
z.Bsp. könnte man die Daten eben in eine html-Tabelle packen, mit CSS stylen und so farbig und hübsch ansehen.
Oder indem man sie in Excel oder LibreCalc bearbeitet ...


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, vom Themenstarter, eingetragen 2017-10-10


Ich weiß jetzt nicht, was du von mir denkst, Einfältiger, was ich gepostet habe, ist von mir, nicht irgendwo aus dem Netz kopiert.
 
Mir macht jetzt gerade Schwierigkeit die Primteilerproduktion in eine Funktion auszulagern. Die Übergabe will nicht funktionieren..... Du siehts in dem Progrämmlein unten die PZ-Funktion ausgelagert, aber die Teilersuchfunktion integriert im Hauptprogramm. Ich will diese aber auch ausgelagert ....


ich will quasi dies als Funktion:
C++
bool prim();// Bool Primzahlprüfung
bool prim(int n){
    int x;
    if(n<2) return false;
    if(n==2) return false;
    if(n%2==0) return false;
    for(x=3;x<=sqrt(n);x+=2){
        if(n%x==0)
        return false;
    }
    return true;
}
 
 
int x;
int z;
int main(int argc, const char * argv[]) {
    for (x=3;x<=1000;x=x+2)
    {
        std::cout<<"Zahl "<<x<<" ";
        for(z=3;z<=sqrt(x);z=z+2) //Teilersuchfunktion
        {
            if(x%z==0)
            {if(prim(z)==true)
    std::cout<<" "<<z<<" ";
            }
            }
        std::cout<<"\n";
        }
    return 0;
}



-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1214
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, eingetragen 2017-10-10


Dass du Code kopierst, habe ich nicht gedacht und wollte ich auch nicht andeuten. Ich wollte eher darauf hinaus, dass du schlecht strukturierst.

Die globalen Variablen zusammen mit gleichnamigen lokalen Variablen würden mich bspw. ziemlich verwirren.

Zudem ist dein Vorgehen sehr ineffizient.

Hier mal eine Anregung:
C++
#include <iostream>
#include <vector>
#include <fstream>
 
/*
	Prime sievle
 
	Returns a vector P of length N+1
	with P(n) = isPrime(n)
	Example: primeSievle(30) -> [2,3,5,7,11,13,17,19,23,29]
*/
std::vector<int> primeSievle(int N){
	std::vector<bool> isPrime(N+1,1); // Create vector of booleans from 0 to N
	isPrime[0] = 0;
	isPrime[1] = 0;
	int p = 2;
	while (p*p <= N){
		// Sievle out multiples of prime p
		for (int t = 2*p; t <= N; t += p){
			isPrime[t] = 0;
		}
		// Find next prime
		for (++p; p*p <=N && !isPrime[p]; ++p);
	}
	// create result vector
	std::vector<int> primes;
	// fill result vector
	for (p = 0; p <= N; ++p){
		if (isPrime[p]) primes.push_back(p);
	}
	return primes;
}
 
/*
	Factorization
 
	Factorizes N and returns a list of its prime divisors.
	Primes has to contain a list of all primes less than or equal to sqrt(N).
	Example: factorize(60,[2,3,5,7]) -> [2,2,3,5] 
*/
std::vector<int> factorize(int N, const std::vector<int>& Primes){
	std::vector<int> factorization;
	int p;
	for (int i = 0; i < Primes.size(); ++i){
		p = Primes[i];
		// Break condition
		if (p*p>N){
			// Add greatest prime factors if exists
			if (N > 1){
				factorization.push_back(N);
			}
			return factorization;
		}
		// Extract prime factor p
		while (N % p == 0){
			factorization.push_back(p);
			N /= p;
		}
	}
	return factorization;
}
 
/*
	Print std::vector<int> to stream str
*/
void printList(const std::vector<int>& lst, std::ofstream& str){
	str << "[";
	for (int i = 0; i < lst.size()-1; ++i){
		str << lst[i] << ",";
	}
	str << lst[lst.size()-1] << "]";
}
 
/*
	Takes a number ending on 6 and 
	prints all sums of numbers ending on 3 
	with factorization to a file specified in path.
	Example: processNumber(36,path) -> 
	3	[3]	33	[3,11]
	13	[13]	23	[23]
*/
void processNumber(int N, const char* path){
	std::ofstream file;
	file.open(path);
	const std::vector<int> Primes = primeSievle(N);
	int A,B;
	for (A = 3; 2*A <= N; A += 10){
		B = N - A;
		file << A << "\t";
		printList(factorize(A,Primes),file);
		file << "\t";
		file << B << "\t";
		printList(factorize(B,Primes),file);
		file << "\n";
	}
	file.close();
}
 
int main(int argc, char** argv) {
	processNumber(66,"test.dat");
	return 0;
}

Das produziert eine Datei mit den Zeilen:

3        [3]        63        [3,3,7]
13        [13]        53        [53]
23        [23]        43        [43]
33        [3,11]        33        [3,11]

Damit könnte man dann weiter herumspielen und bspw. eine hübsch formatierte Tabelle erstellen.
Natürlich könnte man bereits die processNumber-Funktion ändern oder eine Hilfsfunktion für die Zerlegung und Ausgabe eine Paares (A,B) schreiben.
Man könnte auch die Argumentliste des Programms als Eingabe parsen und verarbeiten ...
Weiterhin hast du hier Funktionen wie das Primzahlsieb, die man eventuell auch an anderer Stelle noch nutzen kann.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, vom Themenstarter, eingetragen 2017-10-10


Erst mal schönen Dank für den code .. werd ihn gleich probieren ....

2017-10-10 18:08 - DerEinfaeltige in Beitrag No. 8 schreibt:
Die globalen Variablen zusammen mit gleichnamigen lokalen Variablen würden mich bspw. ziemlich verwirren.

Was meinst Du damit?
Es ist grade meine Schwierigkeit, einen Variableninhalt von einer Funktion in's Programm zu kriegen.


Zudem ist dein Vorgehen sehr ineffizient.

Ohne Dein Urteil in Abrede zu stellen, muß ich fragen, in welcher Hinsicht Du das meinst?
immerhin tut er, was er soll ....

Ich hab ja die Funktionen auch erledigt, nur nicht alles in Funktionen ausgelagert, weil ich die Werteübergabe irgendwie nur intuitiv und halb bewältige.



Man könnte auch die Argumentliste des Programms als Eingabe parsen und verarbeiten ...
Weiterhin hast du hier Funktionen wie das Primzahlsieb, die man eventuell auch an anderer Stelle noch nutzen kann....

Was bedeutet Parsen auf Programmatisch? Im Deutschen meint man damit die alten Perser.


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, eingetragen 2017-10-10


Hallo Bekell,

ich möchte eigentlich nur folgende Dinge zu Deinem Vorhaben sagen:

1. Du formulierst mal wieder ziemlich schwammig (wie in vielen Deiner Posts), was Du überhaupt GENAU vor hast. Da ist es kein Wunder, wenn andere Schwierigkeiten haben zu verstehen was Du meinst.

2. In dem einen Codebeispiel verwendest Du die Variable t und in dem anderen Codebeispiel die Variable x stattdessen. Warum? Das ist auch schon wieder nicht ganz durchgängig.

3. Dein Screenshot in Beitrag #3 passt überhaupt nicht zu Deiner Funktion im Themenstart.

4. Deine Funktion gibt überhaupt nicht die Primteiler aus, sondern bei z. B. t=1000 die Werte 3, 1000, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31. Die 5 fehlt komplett und es sind nicht alles Primteiler, weil etliche Nicht-Primzahlen in der Liste enthalten sind.

4. Wenn Du nur schreibst "Das hab ich als Funktion creirt. Sie will nicht", dann ist das wenig hilfreich. Was hättest Du denn erwartet, dass die Funktion tut und was ist stattdessen passiert (welche Fehlfunktion oder welche Ausgabe oder welche Fehlermeldung). Da müsstest Du schon genauere Infos liefern.

5. Hast Du die Funktion überhaupt aufgerufen? void gt(); ist jedenfalls kein Funktionsaufruf. Dieser wäre nur gt(); und die Funktion wird üblicherweise innerhalb der main()-Funktion aufgerufen.

6. Was DerEinfaeltige mit HTML-Datei meinte soll ja nicht bedeuten, dass Du eine weiß Gott wie aufwendige Webseite programmieren sollst. Aber Du kannst eben Deine Ausgabe einfach in eine Textdatei speichern, nur dass Du dieser nicht die Endung .txt, sondern die Endung .html gibst. Und mit ein bisschen Wissen über CSS Styles kann man gewisse Bestandteile Deiner Textdatei eben einfärben, und Du brauchst dann nur die Datei anzuklicken und sie wird ganz komfortabel mit den richtigen Einfärbungen im Webbrowser geöffnet. Falls Dir das mit CSS zu aufwendig ist, genügt es theoretisch auch schon, um Deine Primzahl einfach einen font-Tag zu legen, z. B.
HTML-Text
<font color="red">29</font>
, was Du direkt über C++ schon reingenerieren kannst. Das mit dem font-Tag ist zwar veraltet und entspricht keinem modernen und sauberem HTML, aber ich denke für Deine Zwecke würde das schon ausreichen (das wäre halt die quick & dirty-Lösung). Natürlich kann man das dann noch perfektionieren, wenn die eigentliche Programmlogik mal steht.

Soweit meine Anmerkungen dazu. Nun mach was draus.

LG Primentus

[Die Antwort wurde nach Beitrag No.8 begonnen.]



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, vom Themenstarter, eingetragen 2017-10-10


Hallo Primentus,

(2017-10-10 18:29 - Primentus
2. In dem einen Codebeispiel verwendest Du die Variable t und in dem anderen Codebeispiel die Variable x stattdessen. Warum?

....weil es aus zwei diversen Versuchen ist.


3. Dein Screenshot in Beitrag #3 passt überhaupt nicht zu Deiner Funktion im Themenstart.
Ja, ist auch aus einem anderen, ähnlichen Makro


4. Deine Funktion gibt überhaupt nicht die Primteiler aus, sondern bei z. B. t=1000 die Werte 3, 1000, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31.
Hatte es auch schon bemerkt und ausgebessert ... siehe unten


Die 5 fehlt komplett enthalten sind.

5 ist uninteressant, weil was mal 5 immer auf 5 oder 0 endet, nie auf 3


4. Wenn Du nur schreibst "Das hab ich als Funktion creirt. Sie will nicht", dann ist das wenig hilfreich. Was hättest Du denn erwartet, dass die Funktion tut und was ist stattdessen passiert (welche Fehlfunktion oder welche Ausgabe oder welche Fehlermeldung). Da müsstest Du schon genauere Infos liefern.

Also, ich wollte nur dieses Teil, das Primteiler identifizieren und ausgeben in eine Funktion ausgelagert haben. Der Knackpunkt, es haperte bei mir an der Datenübergabe.


5. Hast Du die Funktion überhaupt aufgerufen? void gt(); ist jedenfalls kein Funktionsaufruf. Dieser wäre nur gt(); und die Funktion wird üblicherweise innerhalb der main()-Funktion aufgerufen.

ja, ich hatte nur die Funktion selbst gepostet, nicht die Hauptroutine ....

Diese Makro funktioniert, weil ich die PTIdentifikation wieder integriert habe. Es ist aber wegen Formatierungsproblemen ziemlich schlecht leserlich. Ich möchte in der Mitte die Gleichungsleiste, und rechts, bzw links daneben, entweder das p für PZ, oder die PT-liste. Da diese unterschiedlich lang ist, entsteht Kuddelmuddel. Das ist das Problem. Ich will es aber schön optisch haben, denn  nur, was man sieht, kann  man verstehen.
C++
#include <vector>
#include <cstdio>
#include <string.h>
#include <iostream>
using namespace std;
#include <sstream>
#include <string>
#include <math.h>
#include <stdbool.h>
#include <iomanip>
#include <fstream>
 
bool prim();// Bool Primzahlprüfung
bool prim(int n){
    int x;
    if(n<2) return false;
    if(n==2) return false;
    if(n%2==0) return false;
    for(x=3;x<=sqrt(n);x+=2){
        if(n%x==0)
        return false;
    }
    return true;
}
 
int z;
int zahl;
int Grenze = 2003;
int Nr=1;
int Brueckenzaehler=0;
 
int main(int argc, const char * argv[]){
 
ofstream result3;
 
result3.open("result3.csv");
 
 
 
    for(zahl=3;zahl<=(Grenze/2)+7;zahl=zahl+10){
        int x=Grenze-zahl;
 
    cout<<setw(3)<<Nr<<".  ";
    //cout<<setw(3)<<zahl<<"";
        if(prim(zahl)==true){
        cout<<setw(10)<<"p";}
        else{
            for(z=3;z<=sqrt(zahl);z=z+2) //Primteilersuche
            {
                if(zahl%z==0)
                {if(prim(z)==true)
                    cout<<setw(2)<<z<<"";
                }
            }
        //cout<<setw(2)<<" ";
 
 
        }
        cout<<setw(5)<<zahl<<"";
 
 
        cout<<" + "<<setw(5)<<x+3<<"";
        if(prim(x+3)==true){
        cout<<setw(2)<<"p";}
        else{
        cout<<setw(2)<<" ";}
 
        cout<<" = "<<zahl+x+3<<" "<<setw(4)<<((Grenze+3)/20)+2-Nr<<". ";
 
        if (prim(zahl)==true && prim(x+3)== true){
        Brueckenzaehler++;
            cout<<Brueckenzaehler<<". Brücke\n";
        }
        else
        cout<<"\n";
       // result3<< "\033[1;31mRED TEXT\033[0m" << std::endl;
        Nr++;
        result3<<setw(3)<<Nr<<".  "<<setw(3)<<zahl<<" +"<<x+3<<" = "<<zahl+x+3<<"\n";
    }
        cout<<Brueckenzaehler<<" Brücken \n";
    result3.close();
    return 0;
 
}
 







-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, eingetragen 2017-10-10


Hallo Bekell,

ok - ersetze mal diese Codezeile
2017-10-10 19:16 - Bekell in Beitrag No. 11 schreibt:
C++
result3.open("result3.csv");

durch diese Zeile:
C++
result3.open("result3.html");

Und ersetze dann diese Codezeile
2017-10-10 19:16 - Bekell in Beitrag No. 11 schreibt:
C++
        result3<<setw(3)<<Nr<<".  "<<setw(3)<<zahl<<" +"<<x+3<<" = "<<zahl+x+3<<"\n";

durch diese Zeilen:
C++
        result3<<"<html><head><title>Primteiler</title></head><body>";
        result3<<setw(3)<<Nr<<".  "<<setw(3);
        if (prim(zahl))
            result3<<"<font color=red>"<<zahl<<"</font>";
        else
            result3<<zahl;
        result3<<" +";
        if (prim(x+3))
            result3<<"<font color=red>"<<x+3<<"</font>";
        else
            result3<<x+3;
        result3<<" = "<<zahl+x+3<<"<br>";
        result3<<"</body></html>";

Auf diese Weise wird anstelle der CSV-Datei eine HTML-Datei erzeugt, in der die Summanden, die Primzahlen sind, rot markiert werden. Einfach die erzeugte HTML-Datei im Browser öffnen. Vielleicht ist das ja schon das, was Du wolltest.

LG Primentus

Edit: Ok, und das müsstest Du dann noch kombinieren mit den Vorschlägen, die für die Primteiler-Ermittlung gemacht wurden. Und falls Du das Ganze dann am Gleichheitszeichen oder Pluszeichen ausrichten willst - das kann man dann ebenfalls noch ergänzen.

Edit2: Die gute Nachricht: Eine als Tabelle formatierte HTML-Liste lässt sich sogar sehr gut nach Excel kopieren. Aber diese Formatierung würde ich dann erst als letztes machen, wenn die restliche Programmlogik steht.



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, vom Themenstarter, eingetragen 2017-10-11


Danke Primentus,

im Xcode Fenster sieht es jetzt so aus:


wenn ich die Datei aber über Safari öffne, so:


So, durch die Rotfärbung kann jetzt das dämliche p entfallen. Jetzt muß nur noch links und rechts die Liste der aktiven Primteiler zu jeder ungeraden NichtPrimZahl links davor oder rechts dahinter, aber so, daß die Kolumne mit den Additionsgleichungen strikt in der Mitte bleibt. Bis 10 Tod sind kaum mehr als 3 Primteiler zu erwarten. Danach kann auch das Gleichheitszeichen und die immer identische Summe entfallen ...




-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, eingetragen 2017-10-11


Hallo Bekell,

ok, ich sehe gerade anhand Deines Screenshots, dass die erzeugte HTML-Syntax nicht ganz korrekt ist, da in jeder Zeile erneut die html- und body-Tags generiert werden.

Füge mal nach der Codezeile
C++
result3.open("result3.html");
noch diese Codezeile ein (muss dann in einer Zeile stehen):
C++
result3<<"<html>\n<head><title>Primteiler</title></head>\n<body>
<table style=\"text-align:right\">\n";
Und ersetze dann diese Codezeilen
C++
        result3<<"<html><head><title>Primteiler</title></head><body>";
        result3<<setw(3)<<Nr<<".  "<<setw(3);
        if (prim(zahl))
            result3<<"<font color=red>"<<zahl<<"</font>";
        else
            result3<<zahl;
        result3<<" +";
        if (prim(x+3))
            result3<<"<font color=red>"<<x+3<<"</font>";
        else
            result3<<x+3;
        result3<<" = "<<zahl+x+3<<"<br>";
        result3<<"</body></html>";
    }
durch diese Codezeilen:
C++
        result3<<"<tr><td>"<<setw(3)<<Nr<<".  "<<setw(3)<<"</td>";
        if (prim(zahl))
            result3<<"<td></td><td><font color=\"red\">"<<zahl<<"</font></td>";
        else
            result3<<"<td>(Primteiler) </td><td>"<<zahl<<"</td>";
        result3<<"<td> +</td>";
        if (prim(x+3))
            result3<<"<td><font color=\"red\">"<<x+3<<"</font></td><td></td>";
        else
            result3<<"<td>"<<x+3<<"</td><td> (Primteiler)</td>";
        result3<<"<td> = "<<zahl+x+3<<"</td></tr>\n";
    }
        result3<<"</table>
\n</body>\n</html>";
Die letzten beiden Zeilen müssen in einer Zeile stehen (das wird hier falsch angezeigt).

So wird nun vernünftiges HTML erzeugt (jedoch noch ohne Verwendung von CSS-Klassen). Das kann man dann noch machen, falls Du tatsächlich noch eine umfangreichere Art der Formatierung benötigst. Und ich habe die Ausgabe mal in Tabellenform vorgenommen, so dass die einzelnen Spalten sauber untereinander stehen. Da wo jetzt "(Primteiler)" steht, musst Du dann halt noch die Liste der Primteiler ausgeben, wozu andere Matheplanetarier Dir hier oder im Thread "C++ Formatierung" Codevorschläge gemacht haben.

Und das schöne ist wie gesagt: Wenn Du den Text der erzeugten HTML-Datei im Browser markierst (also den angezeigten Text - nicht den Code), dann kannst Du das per Copy & Paste wunderbar in Excel reinkopieren. Die Spaltenzuordnungen bleiben dabei erhalten.

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.15, vom Themenstarter, eingetragen 2017-10-11


Danke, jetzt sieht es so aus:



ich  hoffe, zum andern komm ich heute Abend, muß noch was arbeiten ...

zu den Vorschlägen der andern: Die denken immer 2 und 5 als PZ mit. Ich brauch und will die nicht haben als Primzahlen.... man muß auf weiten Reisen Ballast abwerfen ....



-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26072
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.16, eingetragen 2017-10-11


2017-10-11 17:16 - Bekell in Beitrag No. 15 schreibt:
Ich brauch und will die nicht haben als Primzahlen....
Man kann sich alles zurechtbiegen wie es einem in den Kram paßt biggrin



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.17, vom Themenstarter, eingetragen 2017-10-11


2017-10-11 17:48 - viertel in Beitrag No. 16 schreibt:
2017-10-11 17:16 - Bekell in Beitrag No. 15 schreibt:
Ich brauch und will die nicht haben als Primzahlen....
Man kann sich alles zurechtbiegen wie es einem in den Kram paßt biggrin

Naja, Viertel,5 x was ergibt nie eine Zahl mit 3 am Ende, genausowenig, wie 2 .... warum also den Programmieraufwand, wenn's gar nicht gebraucht wird?


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26072
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.18, eingetragen 2017-10-11


Bekell schreibt:
Naja, Viertel,5 x was ergibt nie eine Zahl mit 3 am Ende, genausowenig, wie 2
Und was ist <math>5 \cdot 2.6=?</math>

Ok, dir geht es natürlich um ganze Zahlen, und bei deinem Problem mit der endenden 3 sind die 2 und die 5 natürlich unbrauchbar.

Dein Satz
Bekell schreibt:
Ich brauch und will die nicht haben als Primzahlen
klang nur so allgemeingültig kompromißlos wink



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.19, eingetragen 2017-10-11


2017-10-11 17:16 - Bekell in Beitrag No. 15 schreibt:
zu den Vorschlägen der andern: Die denken immer 2 und 5 als PZ mit. Ich brauch und will die nicht haben als Primzahlen.... man muß auf weiten Reisen Ballast abwerfen ....

Naja, wenn Du ohnehin nur Zahlen betrachtest, die auf 3 enden, dann werden die Primzahlen 2 und 5 ohnehin nicht als Teiler auftauchen, insofern passt der Algorithmus schon, den z. B. viertel geschrieben hat.

Und notfalls musst Du eben an entsprechender Stelle if-Abfragen einbauen, wenn bestimmte Primteiler nicht mit aufgelistet werden sollen.

Ich weiß nur nicht, ob das immer so gut ist, wenn Du bei Deinen Betrachtungen bestimmte Primzahlen generell ignorierst. Ich sehe da wieder die Gefahr, dass Du dann eines Tages wieder irgendwelche Schlussfolgerungen ziehst, die möglicherweise so gar nicht stimmen. Du sprichst ja immer davon, dass Du etwas Größeres vor hast.

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.20, vom Themenstarter, eingetragen 2017-10-12


Also, ich pack die primteiler jetzt in einen Vector, das ist kein Problem.

Mein Problem ist, wie ich die in cout, oder fout in den Ausdruck reinkriege, ohne umständlich eine Automator-Schleife einbauen zu müssen, von der ich nicht weiss, ob sie dort funktioniert.

C++
  for(auto it = Laengen.begin(); it != Laengen.end();it++)
    {
        std::cout<<nrl<<". "<< *it<<" "<<nrl<<"-er Ketten\n ";// Hier spuckt er aus

Also, sowas will ich nicht benutzen, weil es zu lang ist. Die Länge eines Vektors kann man ja auch viel bequemer abgreifen.


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1214
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.21, eingetragen 2017-10-12


Definiere mal genau, was deine Hilfsfunktion machen soll.

Also:
Welche Daten gehen rein, welche Daten sollen herauskommen, welche Seiteneffekte sollen eintreten?

Am Besten mit ein oder zwei Beispielen und ohne Begriffe wie "Automatorschleife".
Man kann nur vermuten, dass du damit eine "for"-Schleife meinst, die den Typ ihrer Iterators durch das Schlüsselwort "auto" selbst inferiert und hier völlig überflüssig ist.


Folgende Funktion gibt bspw. einen vector auf einen Stream aus.
C++
/*
	Print std::vector<int> to stream str
*/
void printList(const std::vector<int>& lst, std::ofstream& str){
	str << "[";
	for (int i = 0; i < lst.size()-1; ++i){
		str << lst[i] << ",";
	}
	str << lst[lst.size()-1] << "]";
}



-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.22, vom Themenstarter, eingetragen 2017-10-12


Ich hab die Funktion mal über Main eingesetzt, und im Ausdruck (Primteiler) unter Weglassung der Klammern durch <<printList<< ersetzt:

Das Ergebnis 1:



und hier der HTLM Teil:



Die 1 hinter dem 2. Summanden ist sicherlich der erste triviale Teiler, die Primteiler fehlen, und die trivialen Teiler einschließlich 1, 2, 5 und Zahl sollen weg ....

ich hab jetzt einen vector geschaffen:
C++
vector<int>ptsamm(10);

und sammle die Daten ein:
C++
  if((x+3)%z==0)
                {if(prim(z)==true)
                    cout<<setw(2)<<z<<" ";
                    ptsamm.push_back(z);
                }

aber, wie krieg ich die von diesem Vector in die void-Funktion oben ....
und vor allem, weil links und rechts gesammelt wird, brauch ich zwei Vektoren, also ptsamml und ptsammr ....

wenn ich in dem übernommenen Funktion meinen vector einsetze, sieht es so aus:


Das war nicht mein Ziel: (Muß was arbeiten jetzt ...)




-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.23, eingetragen 2017-10-12


Hallo Bekell,

Du kannst für die Ausgabe nicht einfach nur printList schreiben, Du musst da schon einen Funktionsaufruf machen, wo Du den Vektor und den ofstream, in den gespeichert werden soll, übergibst.

Dass Du im Endeffekt zwei Vektoren brauchst, die letztlich parallel mitlaufen, sehe ich auch so.

Prinzipiell brauchst Du ja auch noch eine Logik, die Dir die Teilerliste ermittelt. Da würde ich Dir empfehlen, auf die Funktion Teiler und die Klasse von viertel im Thread "C++ Formatierung" zurückzugreifen.

Ich würde dann vor dem eigentlichen For-Schleifen-Durchlauf erstmal die beiden Vektoren vom Typ TZeilen erzeugen, und dann kannst Du in der eigentlichen For-Schleife einen Zähler hochzählen und je nach Erfordernis vom einen oder vom anderen TZeilen-Vektor auslesen.

Für die Ausgabe würde ich dann folgende Get-Funktion verwenden, die Dir das i-te Element (d. h. die i-te Teilerliste) aus dem übergebenen Vektor herausholt:
C++
void TZeilen::Get(unsigned int i, ofstream& str)
{
    str<<FZeilen[i].rechts;
}

Das Feintuning mit dem Ausschließen der 1 und der Zahl selbst und dass nur Teiler, die prim sind, ausgegeben werden sollen, kannst Du dann am Schluss noch machen. Die 2 und die 5 müssen nicht extra ausgeschlossen werden, da ich dachte, dass Du nur Zahlen mit 3 am Ende betrachtest. Aber notfalls kann man natürlich auch das noch abfragen. Dazu müsstest Du halt in der Funktion Teiler weitere if-Bedingungen bei dieser Codezeile hinzufügen (also i soll auch noch prim sein und nicht 1 und nicht n):
C++
if (n%i==0)

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.24, vom Themenstarter, eingetragen 2017-10-12


Danke Primentus für alles,

ich habe die Ausgabe, so wie ich sie mir gestellt hatte, jetzt geschafft in HTML, hab sogar den Abstand (Anzahl der PrimTeiler) automatisiert. Das mit nach Excel kopieren klappt großartig. Der Ausdruck sieht jetzt so aus. Das mit HTML war eine gute Idee. Ist zwar bisschen viel Code, aber dafür der Ausdruck verständlicher.



Was ich nicht geschafft habe, bisher, sind die Funktionsaufrufe. Das ärgert mich! Ich habe die angebotenen Funktionen letztlich nicht nutzen können, weil sie mit Befehlen durchsetzt, die es in meinem Lehrbuch nicht gibt, und die ich daher nur angeahnt hatte, was sie bedeuten.

Irgendwie muß ich das noch schaffen.

Mathematisch gehe ich ahnungsweise davon aus, daß die Anzahl der unterwurzligen Primteiler ungefähr so  groß ist, wie die Anzahl der stellen im Dezimalsystem. Ist das praktikabel?

Ich geb nochmal den Code zum Testen:
C++
#include <vector>
#include <cstdio>
#include <iostream>
using namespace std;
#include <sstream>
#include <string>
#include <cmath>
#include <stdbool.h>
#include <iomanip>
#include <fstream>
 
bool prim();// Bool Primzahlprüfung
bool prim(int n){
    int x;
    if(n<2) return false;
    if(n==2) return false;
    if(n%2==0) return false;
    for(x=3;x<=sqrt(n);x+=2){
        if(n%x==0)
            return false;
    }
    return true;
}
 
 
 
 
int z;
int zahl;
int Grenze = 7303;
int Nr=1;
int Brueckenzaehler=0;
int ptz = 1; //PrimTeilerzähler
int n;
 
int main(int argc, const char * argv[]){
 
    ofstream result4;
 
    result4.open("result4.html");
    result4<<"<html>\n<head><title>Primteiler</title></head>\n<body>
<table style=\"text-align:right\">\n";
 
    for(zahl=3;zahl<=(Grenze/2)+7;zahl=zahl+10){
        int x=Grenze-zahl;
 
        cout<<setw(3)<<Nr<<".  ";
        result4<<"<tr><td>"<<setw(2)<<Nr<<". ";
        //cout<<setw(3)<<zahl<<"";
        if(prim(zahl)==true){
            cout<<setw(1)<<"p";
            result4<<"<td></td><td></td><td></td><td></td><td>"<<setw(10)<<"<font color=\"red\">"<<setw(0)<<zahl<<"</font></td> ";
       }
        else{
            for(z=3;z<=sqrt(zahl);z=z+2) //Primteilersuche
            {
                if(zahl%z==0)
                {if(prim(z)==true){
                    cout<<setw(0)<<z<<" ";
                    result4<<"<td>"<<setw(0)<<z<<"</td>";
                    ptz++;}
                }
            }
            for(n=ptz;n<=sizeof(Grenze);n=n+1){//Zelleineinsetzer für HTML
                result4<<"<td>""</td> ";
                }
            ptz=1;
            result4<<"<td>"<<setw(0)<<zahl<<"</td> ";
        }
        cout<<setw(2)<<zahl<<"";
        cout<<" + "<<setw(2)<<x+3<<" ";
 
 
        if(prim(x+3)==true){
            cout<<setw(2)<<"p";
            result4<<"<td>+<font color=\"red\">"<<setw(0)<<x+3<<"</font></td> ";}
 
        else {
            result4<<"<td>+"<<setw(0)<<x+3<<"</td> ";
            for(z=3;z<=sqrt(x+3);z=z+2) //Primteilersuche
            {
            if((x+3)%z==0)
            {if(prim(z)==true){
                cout<<setw(0)<<z<<"-";
                result4<<"<td>"<<setw(0)<<z<<"</td> ";
                ptz++;
            }
            }
            }
            for(n=ptz;n<=sizeof(Grenze);n=n+1){//Zelleineinsetzer für HTML 3 PT werden erwartet
                result4<<"<td>""</td> ";
            }
            ptz=1;
        cout<<setw(1)<<"+ ";}
        cout<<" Rnr."<<setw(1)<<((Grenze+3)/20)+2-Nr<<". ";
 
        if (prim(zahl)==true && prim(x+3)== true){
            Brueckenzaehler++;
            cout<<Brueckenzaehler<<". Brücke\n";
            result4<<"<td>"<<Brueckenzaehler<<". Bruecke</td>";
        }
        else{
        cout<<"\n";}
          Nr++;
    }
    result4<<"</table>
\n</body>\n</html>";
    cout<<Brueckenzaehler<<" Brücken \n";
    result4.close();
    return 0;
}

Verbesserungsvorschläge, soweit ich sie verstehe und capiere, werden beherzigt ....



 


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.25, eingetragen 2017-10-12


Hallo Bekell,

das sieht auf jeden Fall gut aus, was Du jetzt programmiert hast.
Das Ergebnis der Anzeige müsste ja jetzt das sein was Du haben wolltest.

Was Funktionsaufrufe betrifft - nun ja, die Funktion prim() hast Du ja auch problemlos programmiert und aufgerufen. Man muss jedoch dazu sagen, dass in dem Code von viertel prozedurale Programmierung mit objektorientierter Programmierung vermischt wurde. Vielleicht hat Dich die objektorientierte Programmierweise etwas verunsichert. Deine Funktion prim() ist eine prozedurale Funktion, während z. B. die Klasse TZeilen mitsamt ihren Variablen (auch Instanzvariablen genannt) und ihren Funktionen (auch Methoden genannt) objektorientierter Programmierstil ist. Das erkennst Du beim Aufruf dann immer daran, dass dem Funktionsnamen immer eine Objektvariable vorangestellt ist, z. B. Zeilen.Add()
Da treten sozusagen keine "alleinstehenden" Funktionen Add() auf, sondern die sind immer an eine Instanz eines Objektes gebunden.

Also ich hab mal Deinen Code und den Code von viertel zusammengeführt und noch ein paar eigene Ergänzungen gemacht. Du kannst das ja mal mit Deinem jetzigen Code vergleichen, und Dir die Funktionsaufrufe anschauen, und vielleicht kannst Du was davon in Deinen jetzigen Code übernehmen. Kann sein, dass der Code noch optimierbar ist (bin nicht grad ein C++ Guru), aber jedenfalls liefert er das Ergebnis das Du wolltest:
C++
#include <vector>
#include <cstdio>
#include <string.h>
#include <iostream>
using namespace std;
#include <sstream>
#include <string>
#include <math.h>
#include <stdbool.h>
#include <iomanip>
#include <fstream>
 
bool prim();// Bool Primzahlprüfung
bool prim(int n){
    int x;
    if(n<2) return false;
    if(n==2) return false;
    if(n%2==0) return false;
    for(x=3;x<=sqrt(n);x+=2){
        if(n%x==0)
        return false;
    }
    return true;
}
 
int z;
int zahl;
int Grenze = 2003;
int Nr=1;
int Brueckenzaehler=0;
 
 
//******************************************************************
string to_string(int a)
{
   char  buf[99];
   sprintf(buf, "%d", a);
   return buf;
}
//******************************************************************
string Teiler(int n)
{
   string   s;
   for (int i=1; i<=n; i++)
   {
      if (n%i==0 && i!=1 && i!=n && prim(i)) // Teiler nur auflisten, wenn prim und nicht 1 oder Zahl selbst
      {
         if (s.length()) s += string(";");
         s += to_string(i);
      }
   }
   return s;
}
//******************************************************************
class TZeile
{
public:
   string   links, mitte, rechts;
 
   TZeile(string& links, string& mitte, string& rechts);
};
//------------------------------------------------------------------
TZeile::TZeile(string& _links, string& _mitte, string& _rechts)
   : links(_links)
   , mitte(_mitte)
   , rechts(_rechts)
{
}
//******************************************************************
class TZeilen
{
private:
   vector<TZeile> FZeilen;
   int wlinks, wmitte, wrechts;  // Spaltenbreiten
public:
   TZeilen();
   void Add(string links, int zahl, string teiler);   // Eintrag zur Liste hinfügen
   int Anzahl();                                      // wie viele Einträge sind in der Liste ?
   void Print();                                      // die Liste formatiert ausgeben
   void Get(unsigned int i, ofstream& str);           // gibt die i-te Teilerliste aus
};
//------------------------------------------------------------------
TZeilen::TZeilen()
   : wlinks(0)    // jede Spaltenbreite ist =0
   , wmitte(0)
   , wrechts(0)
{
}
//------------------------------------------------------------------
void TZeilen::Add(string links, int zahl, string teiler)
{
   string   s = to_string(zahl);                   // Zahl als String
 
   wlinks  = max(wlinks , (int)links.length());    // Spaltenbreiten anpassen
   wmitte  = max(wmitte , (int)s.length());
   wrechts = max(wrechts, (int)teiler.length());
 
   FZeilen.push_back(TZeile(links, s, teiler));    // Liste ergänzen
}
//------------------------------------------------------------------
int TZeilen::Anzahl()
{
   return FZeilen.size();
}
//------------------------------------------------------------------
void TZeilen::Print()
{
   for (unsigned int i=0; i<FZeilen.size(); i++)
   {
      cout <<
         left  << setw(wlinks+1)  << FZeilen[i].links  <<
         right << setw(wmitte+1)  << FZeilen[i].mitte  << " | " <<
         left  << setw(wrechts+1) << FZeilen[i].rechts << " | " <<
         "\n";
   }
}
//------------------------------------------------------------------
void TZeilen::Get(unsigned int i, ofstream& str)
{
    str<<FZeilen[i].rechts;
}
//******************************************************************
 
int main(int argc, const char * argv[]){
 
ofstream result3;
TZeilen vectteiler,vectteiler2;
int vectpos = 0;
 
for(zahl=3;zahl<=(Grenze/2)+7;zahl=zahl+10)
{
    vectteiler.Add("", vectpos, Teiler(zahl));
    vectpos++;
}
vectpos = 0;
for(zahl=Grenze;zahl>=Grenze/2-7;zahl=zahl-10)
{
    vectteiler2.Add("", vectpos, Teiler(zahl));
    vectpos++;
}
//    vectteiler.Print();
 
 
result3.open("result3.html");
result3<<"<html>\n<head><title>Primteiler</title></head>\n<body>
<table style=\"text-align:right\">\n";
vectpos = 0;
 
 
    for(zahl=3;zahl<=(Grenze/2)+7;zahl=zahl+10){
        int x=Grenze-zahl;
 
    cout<<setw(3)<<Nr<<".  ";
    //cout<<setw(3)<<zahl<<"";
        if(prim(zahl)==true){
        cout<<setw(10)<<"p";}
        else{
            for(z=3;z<=sqrt(zahl);z=z+2) //Primteilersuche
            {
                if(zahl%z==0)
                {if(prim(z)==true)
                    cout<<setw(2)<<z<<"";
                }
            }
        //cout<<setw(2)<<" ";
 
 
        }
        cout<<setw(5)<<zahl<<"";
 
 
        cout<<" + "<<setw(5)<<x+3<<"";
        if(prim(x+3)==true){
        cout<<setw(2)<<"p";}
        else{
        cout<<setw(2)<<" ";}
 
        cout<<" = "<<zahl+x+3<<" "<<setw(4)<<((Grenze+3)/20)+2-Nr<<". ";
 
        if (prim(zahl)==true && prim(x+3)== true){
        Brueckenzaehler++;
            cout<<Brueckenzaehler<<". Brücke\n";
        }
        else
        cout<<"\n";
       // result3<< "\033[1;31mRED TEXT\033[0m" << std::endl;
        Nr++;
        result3<<"<tr><td>"<<setw(3)<<Nr<<".  "<<setw(3)<<"</td>";
        if (prim(zahl))
            result3<<"<td></td><td><font color=\"red\">"<<zahl<<"</font></td>";
        else
        {
            result3<<"<td>(";
            vectteiler.Get(vectpos, result3);
            result3<<") </td><td>"<<zahl<<"</td>";
        }
        result3<<"<td> +</td>";
        if (prim(x+3))
            result3<<"<td><font color=\"red\">"<<x+3<<"</font></td><td></td>";
        else
        {
            result3<<"<td>"<<x+3<<"</td><td> (";
            vectteiler2.Get(vectpos, result3);
            result3<<")</td>";
        }
        result3<<"<td> = "<<zahl+x+3<<"</td></tr>\n";
        vectpos++;
    }
        result3<<"</table>
\n</body>\n</html>";
        cout<<Brueckenzaehler<<" Brücken \n";
    result3.close();
    return 0;
 
}

Zu der Frage, ob die unterwurzligen Primteiler ungefähr der Anzahl Dezimalstellen der zugrundeliegenden Zahl entsprechen: das kann ich ehrlich gesagt nicht beantworten, da ich das noch nie untersucht habe.

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.26, eingetragen 2017-10-13


Hallo Bekell,

ich habe das grad eben mal untersucht, ob die Anzahl Primteiler einer Zahl und die Stellenanzahl derselbigen Zahl ungefähr übereinstimmen.
Dazu habe ich die Differenz der beiden Werte gebildet und das als Absolutbetrag genommen. Differenz Null entspricht sozusagen Übereinstimmung der beiden Werte und Differenz 1 eine Abweichung um 1, Differenz 2 eine Abweichung um 2, usw.

Dabei habe ich alle auf 3 endenden Nicht-Primzahlen zwischen 3 und 1000003 betrachtet, und von diesen Zahlen nur die Teiler gezählt, die prim sind und nicht 1, 2, 5 oder der Zahl selbst entsprechen - und das einmal in der Variante aller auf diese Weise übrig bleibenden Teiler und einmal mit der zusätzlichen Bedingung, nur die "unterwurzligen" davon zu betrachten.

Es gibt sich folgendes Ergebnis:
Tabelle
Differenz | alle Primteiler | nur "unterwurzlige" Primteiler
          | ohne 1,2,5,Zahl | ohne 1,2,5,Zahl
----------+-----------------+--------------------------------
        0 |              16 |     12
        1 |             760 |    636
        2 |            8864 |   6490
        3 |           31691 |  13352
        4 |           38999 |  21433
        5 |               5 |  38412
        6 |               0 |      0
        7 |               0 |      0
        8 |               0 |      0
        9 |               0 |      0
       10 |               0 |      0

Dabei sieht man also, dass es nur sehr wenige (nämlich 16 bzw. 12) Übereinstmmungen zwischen Anzahl Primteiler und Stellenanzahl der Zahl gibt, und Differenz 1 ist auch nicht wahnsinnig oft vertreten. Also Deine Vermutung, dass die beiden Werte meistens ungefähr gleich sind, stimmt so nicht. Bezüglich Differenz 1, 2, 3, usw. steigt die Anzahl Fälle sogar immer mehr. Betrachtet man nur die "unterwurzligen" Primteiler, gibt es sogar noch häufiger große Abweichungen (siehe 38412mal Differenz 5 - das ist der größte Wert dieser Spalte).

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.27, vom Themenstarter, eingetragen 2017-10-13


Danke Primentus, Du hast mich mißverstanden, vollkommen, ich meinte, weil ich, um den Abstand der Gleichung von der Nummer, dazwischen sind die Primteiler, immer gleichzuhalten, soviel leere Zellen einfügen mußte, je weniger PT eine Zahl hat.

Deswegen meine Routine mit dem size-Befehl.

Das es Zahlen mit weniger unterwurzliche Primteiler gibt als es nach der Stellenzahl von n sein müßten, ist vollkommen klar, es gibt ja Semiprimzahlen jede Menge bis in jeden Bereich.

Die Frage ist, ob eine auf 3 endende Zahl aber mehr PT haben kann, als dieselbe Zahl Stellen im Dezimalsystem hat?


Also: Gibt es eine 4-stellige Zahl, die 5 unterwurzliche Primteiler hat und auf 3 endet? Kann es nicht geben, denn die kleinst mögliche ist 3*7*11*13*17, und die hat schon 5 Stellen, zudem hat sie keine 3 hinten. Deshalb müssen für die 7 auch PZ mit 9 hinten rein. 3*7*11*19, sind 4389, auch keine 3 hinten

Man darf ja nicht vergessen, es gibt für uns interessant nur 2 PZ unterhalb von 10^1 , die anderen liegen alle drüber. Das bedeutet, daß mit jeder PZ im unteren Bereich schon mal eine 10-er Potenz (=eine Stelle) dazukommt. Die kleinste mit 3 verschiedenen PT (3*7*11) ist schon 231, aber eventuell ist das in höheren Bereichen anders.


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.28, vom Themenstarter, eingetragen 2017-10-13


2017-10-13 21:09 - Bekell in Beitrag No. 27 schreibt:
ich habe das grad eben mal untersucht, ob die Anzahl Primteiler einer Zahl und die Stellenanzahl derselbigen Zahl ungefähr übereinstimmen.
Danke Primentus, Du hast mich mißverstanden, vollkommen, ich meinte, weil ich, um den Abstand der Gleichung von der Nummer, dazwischen sind die Primteiler, immer gleichzuhalten, soviel leere Zellen einfügen mußte, je weniger PT eine Zahl hat.

Deswegen meine Routine mit dem size-Befehl.
C++
for(n=ptz;n<=sizeof(Grenze);n=n+1){//Zelleineinsetzer für HTML 3 PT werden erwartet
                result4<<"<td>""</td> ";

Wenn die Zahl nur einen PT hat, werden 2 Zellen eingefügt, wenn sie 2 PT hat, werden eine Zelle eingefügt, etc. Und als Maß hab ich sizeof der Variablen, damit die Additionsgleichung immer schön in der Mitte bleibt.


Das es Zahlen mit weniger unterwurzliche Primteiler gibt als es nach der Stellenzahl von n sein müßten, ist vollkommen klar, es gibt ja Semiprimzahlen jede Menge bis in jeden Bereich.

Die Frage ist, ob eine auf 3 endende Zahl aber mehr PT haben kann, als dieselbe Zahl Stellen im Dezimalsystem hat?


Also: Gibt es eine 4-stellige Zahl, die 5 unterwurzliche Primteiler hat und auf 3 endet? Kann es nicht geben, denn die kleinst mögliche ist 3*7*11*13*17, und die hat schon 5 Stellen, zudem hat sie keine 3 hinten. Deshalb müssen für die 7 auch PZ mit 9 hinten rein. 3*7*11*19, sind 4389, auch keine 3 hinten

Man darf ja nicht vergessen, es gibt für uns interessant nur 2 PZ unterhalb von 10^1 , die anderen liegen alle drüber. Das bedeutet, daß mit jeder PZ im unteren Bereich schon mal eine 10-er Potenz (=eine Stelle) dazukommt. Die kleinste mit 3 verschiedenen PT (3*7*11) ist schon 231, aber wahrscheinlich ist das in höheren Bereichen anders, da die PT ja auch höherstellig werden.



-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.29, eingetragen 2017-10-13


2017-10-13 21:54 - Bekell in Beitrag No. 28 schreibt:
Die Frage ist, ob eine auf 3 endende Zahl aber mehr PT haben kann, als dieselbe Zahl Stellen im Dezimalsystem hat?

Ok, Du willst also lediglich wissen, ob die Anzahl der Primteiler einer Zahl auch größer sein kann als die Stellenanzahl dieser Zahl.

Also ich hab mir dazu mal alle auf 3 endenden Nicht-Primzahlen zwischen 3 und 100000003 angesehen und dort jeweils die Primteiler ermittelt (ohne 1, 2, 5, Zahl, wobei 1 und Zahl aber sowieso nicht prim sind und 2 und 5 erst gar nicht als Teiler auftreten) - einmal in der Variante alle so entstehenden Primteiler zu zählen und einmal in der Variante nur die unterwurzligen Primteiler zu zählen.

Bei beiden Varianten konnte ich keinen einzigen Fall finden, bei dem die Anzahl Primteiler größer als die Stellenzahl der zugrundeliegenden Nicht-Primzahl war. Es könnte also sein, dass Du recht hast, aber garantieren kann ich es nicht.

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.30, vom Themenstarter, eingetragen 2017-10-14


Bei den Zahlen mit mehr unterwurzligen PT muß man unterscheiden zwischen rein Primteilerhaltigen, oder allgemeinteilerhaltigen, wie Du es gemacht hast. Die Anzahl der rein primteilerhaltigen wird auch dadurch begrenzt, da, je mehr PT, ja nicht alle Kombinationen möglich sind. PZ(9) * PZ(9) * PZ(9) * PZ(9)  ist nicht nur wegen der Größe nicht möglich, als auch wegen der Endziffer.

Mögliche nur PThaltige unterwurzlige Kombinationen
zweistellig
9*7
1*3
dreistellig
1*3*1
3*3*7
7*7*7
9*7*1
vierstellig
1*1*1*3
3*7*7*7
3*3*3*9
3*7*1*3
3*9*7*7
3*9*1*9
1*1*7*9
9*9*9*7


Es muß ja immer 3 rauskommen hinten .... ich glaub mehr gibt es nicht, es kann bei 4 ja nur 8 geben, oder?



-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.31, eingetragen 2017-10-14


Hallo Bekell,

bei Kombinationen aus zwei Endziffern ergeben bei Multiplikation die folgenden zwei Kombinationen die Endziffer 3:
{1, 3}, {7, 9}
Das hast Du korrekt wiedergegeben.

Bezüglich drei Endziffern sind es allerdings fünf Kombinationen:
{1, 1, 3}, {1, 7, 9}, {3, 3, 7}, {3, 9, 9}, {7, 7, 7}
Da hast Du das {3, 9, 9} vergessen.

Und bezüglich vier Endziffern sind es tatsächlich acht Kombinationen:
{1, 1, 1, 3}, {1, 1, 7, 9}, {1, 3, 3, 7}, {1, 3, 9, 9}, {1, 7, 7, 7}, {3, 3, 3, 9}, {3, 7, 7, 9}, {7, 9, 9, 9}
Allerdings fehlt bei Dir das {1, 7, 7, 7}, und stattdessen hast Du {3, 7, 7, 7} fälschlicherweise aufgezählt (ergibt nicht 3, sondern 9).

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.32, vom Themenstarter, eingetragen 2017-10-14


und bei 5 müßten es 25 Kombinationen sein, weil es 3 Möglichkeiten gibt, von 2 Endziffern einen 1 zu generieren (1*1; 9*9 ;3*7) und 5 Kombinationen die eine 3 generieren = 15, plus, es gibt 2 Kombinationen von 2 Endziffern eine 7 zu generieren (1*7; 3*9) und
5 Möglichkeiten

9*9*9 = 9
1*9*1 = 9
3*7*9 = 9
3*3*1 = 9
7*7*1 = 9

eine 9, macht nochmal 10.


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.33, eingetragen 2017-10-14


Hallo Bekell,

also ich weiß nicht, ob händische Überlegungen da so gut sind. Da vertut man sich schnell.

Also ich komme bezüglich fünf Endziffern lediglich auf 14 Kombinationen:
{1, 1, 1, 1, 3}, {1, 1, 1, 7, 9}, {1, 1, 3, 3, 7}, {1, 1, 3, 9, 9}, {1, 1, 7, 7, 7}, {1, 3, 3, 3, 9}, {1, 3, 7, 7, 9}, {1, 7, 9, 9, 9}, {3, 3, 3, 3, 3}, {3, 3, 3, 7, 7}, {3, 3, 7, 9, 9}, {3, 7, 7, 7, 7}, {3, 9, 9, 9, 9}, {7, 7, 7, 9, 9}

Ich habe diese systematisch ermittelt. Da dürfte eigentlich keine Kombination mehr fehlen. Sonstige passende Kombinationen sind nur Wiederholungen, also die jeweils fünf Endziffern lediglich in einer anderen Reihenfolge.

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.34, vom Themenstarter, eingetragen 2017-10-14


2017-10-14 11:45 - Primentus in Beitrag No. 33 schreibt:
Hallo Bekell,
also ich weiß nicht, ob händische Überlegungen da so gut sind?

Ich weiß es: Sie sind nicht gut! ... da mit Sicherheit fehleranfälliger .... das Ganze ist eine Kombinatorik Frage, ausgehend von der Tatsache, daß bei 2 Endziffern es für 3 und 7 nur 2, für 9 und 1 aber 3 Lösungen gibt. Von da an kann man systematische ein Schema entwickelt, wie Du es sicher getan hast. Ich habe soeben den Fehler begangen, die zweier mit den 3-er Lösungen zu multiplizieren und vergessen, daß sich da noch was wegkürzt.


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 525
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.35, eingetragen 2017-10-14


Hallo Bekell,

naja, ehrlich gesagt bin ich einfach stupide alle Kombinationsmöglichkeiten durchgegangen und habe überprüft, wo die Produktbildung eine Endziffer 3 auswirft, und Duplikate hab ich dann am Schluss entfernt. Das ist auf jeden Fall mal eine sichere Methode, weil man dann nichts übersieht.

Aber es ist gut möglich, dass man es vielleicht auch noch eleganter lösen kann.

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.09.2008
Mitteilungen: 998
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.36, vom Themenstarter, eingetragen 2017-10-14


2017-10-14 13:01 - Primentus in Beitrag No. 35 schreibt:
Hallo Bekell,

naja, ehrlich gesagt bin ich einfach stupide alle Kombinationsmöglichkeiten durchgegangen und habe überprüft, wo die Produktbildung eine Endziffer 3 auswirft, und Duplikate hab ich dann am Schluss entfernt. Das ist auf jeden Fall mal eine sichere Methode, weil man dann nichts übersieht.

Aber es ist gut möglich, dass man es vielleicht auch noch eleganter lösen kann.

LG Primentus

Man könnte, aber das führt von meinem Thema weg, ein 3 Dimensionalen Graphen zeichnen, wie eine Fischerreuse, um die Duplikate wegzukriegen, denn sonst sehe es aus, wie ein Baum.....


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



  Profil  Quote  Link auf diesen Beitrag Link
Bekell hat die Antworten auf ihre/seine Frage gesehen.
Bekell wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2017 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]