Archiv verlassen und diese Seite im Standarddesign anzeigen : char to int (achtung newbie)
Hallo,
folgende Frage: ich muss char in int verwandeln, habe mir vorübergehend mit sscanf() geholfen, suche aber vergeblich die c++ Entsprechung :mauer:
(nein, ich bin nicht zu faul zum nachschauen, ich finds wirklich nicht :( )
Nett wär auch ein Tip wo man sowas möglichst schnell findet, dann muss ich nähstes mal wieder nerven ;)
Gruß & thx
Isaac
cahr in int kann man inplizit umwandeln:
also zB
int i;
char c = "A";
i = c;
und in i ist dann 65 drinn (ASCII fuer A)
das wars, du musst es nur zuweisen
ps
achtung newbie
jeder hat mal angefangen!!!!!!!!!
thx, soweit verstanden und auch damit rumprobiert
Allerdings habe ich zu ungenau gefragt, implizites Umwandeln nicht das richtige für mich, ich brauche den Wert als Int, den Char darstellt, nicht den ASCII Wert.
bin aber mit atoi() auch schon fündig geworden... :)
bitte bereithalten, nächste Frage kommt bestimmt bald auf... :D
Ok, wie angedroht gehts weiter... falls jemand einen Augenblick Zeit dafür hätte, würd ich mich freuen ;)
Wollte mal in größerem Umfang Primzahlen suchen, dabei auf ein paar für mich im Augenblick nicht lösbare Probleme gestoßen. Hier erstmal das, was ich fabriziert hab, unten drunter sind dann mein verzweifelten Fragen :mauer: :(
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
int x, primzahl, temp;
char buffer[100];
bool weitersieben = true;
ofstream myoutsieb1;
ofstream myoutsieb2;
ofstream myoutprimzahlen;
ifstream myinsieb1;
ifstream myinsieb2;
ifstream myinprimzahlen;
myoutsieb1.open("datei1.txt");
for(x = 2; x <= 1000000; x++)
{
if(((x % 2) != 0) && ((x % 3) != 0) && ((x % 5) != 0) && ((x % 7) != 0) && ((x % 11) != 0) && ((x % 13) != 0) && ((x % 17) != 0) && ((x % 19) != 0))
{
myoutsieb1<<x<<"\n";
}
}
myoutsieb1.close();
myoutprimzahlen.open("datei3.txt");
myoutprimzahlen<<"2\n"<<"3\n"<<"5\n"<<"7\n"<<"11\n"<<"13\n"<<"17\n"<<"19\n";
myoutprimzahlen.close();
while(weitersieben)
{
myinsieb1.open("datei1.txt");
myoutsieb2.open("datei2.txt");
if(myinsieb1.getline(buffer,´\n´))
{
primzahl = atoi(buffer);
myoutprimzahlen.open("datei3.txt",ios::app);
myoutprimzahlen<<primzahl<<"\n";
myoutprimzahlen.close();
printf("Aktuell bearbeitete Primzahl: %d\r",primzahl);
while(myinsieb1.getline(buffer,´\n´))
{
sscanf(buffer,"%d",&temp);
if((temp % primzahl) != 0)
{
myoutsieb2<<temp<<"\n";
}
}
myinsieb1.close();
myoutsieb2.close();
}
else
{
myinsieb1.close();
myoutsieb2.close();
weitersieben = false;
}
myinsieb2.open("datei2.txt");
myoutsieb1.open("datei1.txt");
if(myinsieb2.getline(buffer,´\n´))
{
primzahl = atoi(buffer);
myoutprimzahlen.open("datei3.txt",ios::app);
myoutprimzahlen<<primzahl<<"\n";
myoutprimzahlen.close();
printf("Aktuell bearbeitete Primzahl: %d\r",primzahl);
while(myinsieb2.getline(buffer,´\n´))
{
sscanf(buffer,"%d",&temp);
if((temp % primzahl) != 0)
{
myoutsieb1<<temp<<"\n";
}
}
myinsieb2.close();
myoutsieb1.close();
}
else
{
myinsieb2.close();
myoutsieb1.close();
weitersieben = false;
}
}
}
1. Die Ausgabe per printf(). Ich habe es ganz normal mit cout versucht, allerdings erfolgt die Ausgabe dann extrem verzögert. Wird das schreiben in die Dateien und die Ausgabe auf den Bildschirm gleichzeitig behandelt und deswegen so verzögert und wie könnte ich das auch mit cout umgehen?
2. Das ganze ist zwar schon schneller als mein erster Versuch, aber hinkt leider immer noch gewaltig vor sich hin... wie bekomme ich etwas hin, das schneller läuft, bzw wie kann ich das hier schneller machen? Meine einzige Idee war bis jetzt, dass ich die ersten paar Primzahlen schon rausgenommen hab.
Gruß und thx
Isaac
Dominic Suter
17.04.2002, 08:39
Eines vorweg: Ich bin nicht der C++ Profi, also bitte belehrt mich wenn ich jetzt etwas falsches sage.
So wie ich das sehe, machst die Kontrolle, ob x eine Primzahl ist in diesem Therm: if(((x % 2) != 0) && ((x % 3) != 0) && ((x % 5) != 0) && ((x % 7) != 0) && ((x % 11) != 0) && ((x % 13) != 0) && ((x % 17) != 0) && ((x % 19) != 0))
Ich glaube, dass diese Bedingung einfach zu gross ist. Ich denke auch, dass du hier mit Switch case Bedingungen schneller wärest, da du, falls eine Bedingung nicht zutrifft, sofort eine neue Zahl hohlst und diese Prüfst. (Aber k.A., vieleicht weis ein Mod mehr darüber?)
vieleicht weiss ein Mod mehr darüber
i auf jeden fall nicht so richtig!
also die open wuerde ich ausserhalb der schleife anlegen und probier mal alle ausgaben wegzuklammern!
ich vermute dass printf ziemlich viel zeit braucht, mach do am anfang alle benutzer eingaben primz von - bis!
und warum oeffnest und schliesst du die dateien immer auch und versuch mal felder anstatt dateien und schreibe das ganze erst nach der berechnung in eine datei!
wenn winxp 256 MB brauchen darf kannst du auch 50 MB haben oder ?
@Stoenggi: Bis zur Schleife ist der Zeitaufwand noch akzeptabel, und diese Anweisung, auch wenn sie crappy aussieht, haut im Vorraus schon über die Hälfte der Zahlen weg, meiner Meinung nach lohnt sich das also...
@xOOn: Ich hab das ganze versucht mit Feldern zu schreiben, aber da würde ich am Anfang doch ein long int a[1000000] brauchen, oder seh ich das falsch...? Des läßt sich bei mir compilieren, schmiert aber beim ausführen ab... :mauer:
also der schnellste primzahl algorithmus ist afaik folgender:
if ((x % 2) != 0) {
y = 3;
while (((x % y) != 0) && (sqrt(x) > y)) {
y += 2;
}
}
Pool4Sky
17.04.2002, 11:09
greetings @ all
hi IS@@C ich habe auch vor einiger Zeit ein
Primzahl prog gecodet hatte mich 2 Tage
beschäftigt, war in meiner Anfangszeit bei
C++ gewesen.
Wenn du so etwas gebrauchen kannst, sag´
Bescheid.
Pool4Sky
--------------------------------
schaust nach vorn siehst nen Opa,
schaust nach hinten siehst nen Kind,
schaust nach unten siehst du grünes weiches Gras !
Original von sami
also der schnellste primzahl algorithmus ist afaik folgender:
Der schnellste Primzahlenalgorithmus ist der Sieb des Eratostenes (oder so ähnlich). Allerdings benötigt man da pro Zahl mindestens ein Bit Speicher, bei den Primzahlen bis 100.000 also z. B. 12.500 Bytes.
#define LIMIT 1000
bool flags[LIMIT] = { false, false};
register int i, j;
for( i = 2; i < LIMIT; ++i)
flags[i] = true;
for( i = 2; i < LIMIT/2; ++i)
{
if( flags[i])
{
for( j = i+i; j < LIMIT; j += i)
flags[j] = false;
}
}
ich hab mal auf meine platte geguckt und hab den sieb des eratosthenes rausgesucht.... sollte eigentlich selbstredent sein.
ok, thx a lot
hab jetzt was ich brauche
era. war mir schon ein brgriff, aber ich hab mist mit dem array gebaut, hab die zahlen an sich gespeichert statt nur bool zu nehmen... das hat anscheinend zuviel speicher gefressen und ging nur in kleinem umfang...
jetzt funzet :]
long int a[1000000]
das waeren dann nur 4 MB das duerfte kein probs sein weil bool auch immerhin 1 MB braucht
falls du speicherplatz sparen willst wuerde ich folgendes
verschlagen:
du definierst
unsigned long x[size/32]
und maskierst dir dann die bit jeweils raus!
zB
die nummer 534
if (x[534 >> 5] & (0x01 << (534 % 32)))
ist zwar langsamer aber funkt gleich gut und setzen kannste sie so
eine 0:
x[534 >> 5] &= ~(0x1 << (534 % 32))
eine 1:
x[534 >> 5] |= 0x1 << (534 % 32)
habe das mal machen muessen, weil damit braucht man nur mehr 1/8 des speichers bei 4MB ist das egal!
war mal ne aufgabe in der schule etwas zu coden wo man 100.000.000 bool benoetigt haette. :mauer: :mauer: :mauer:
Original von Bolle
for( i = 2; i < LIMIT/2; ++i)
Noch schneller wäre:
lim = sqrt(LIMIT);
for( i = 2; i < lim; ++i)
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.