Zethyr Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 (endret) Jeg har litt trøbbel med å finne ut hvordan jeg kan lage noe som finner ut om et nummer er et palindrom i et c++-program jeg jobber med. Alle funksjoner blir et kaos av if-setninger, og umulig å finne ut av. Jobber med heltall opp til 6 siffer. Har man noen måte for å trygt og godt gjøre om et tall til en tekst-streng, blir jo det hele ganske mye enklere Vil det være mulig å bruke en typecast til dette?? PS: Et palindrom er et tall/ord som er akkurat det samme om man snur det bakvendt, f.eks. lol, hahah, anna, etc ... edit: Ja, jeg har prøvd google, men de fleste treff ser ut til å vurdere om tekst-strenger er palindromer. Endret 10. januar 2005 av Zethyr Lenke til kommentar
abcd423417984 Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 Har man noen måte for å trygt og godt gjøre om et tall til en tekst-streng, blir jo det hele ganske mye enklere Vil det være mulig å bruke en typecast til dette?? string ToString(unsigned int tall) { string ret; while(tall != 0) { ret = char((tall % 10) + 0x30) + ret; tall /= 10; } return ret; } Lenke til kommentar
Zethyr Skrevet 10. januar 2005 Forfatter Del Skrevet 10. januar 2005 (endret) Denne returnerer 'string'.. hvilke headere må inkluderes for å bruke dette?? Har ikke vært borti string enda =/ Endret 10. januar 2005 av Zethyr Lenke til kommentar
abcd423417984 Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 (endret) Videre kan du kanskje bruke noe ala dette: bool Palindrom(string str) { bool pal = true; size_t x = 0, y = str.size()-1; while(x < y) { if(str[x] != str[y]) pal = false; ++x; --y; } return pal; } EDIT: fant en feil. er ordnet nå. Endret 10. januar 2005 av invictus Lenke til kommentar
abcd423417984 Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 Denne returnerer 'string'.. hvilke headere må inkluderes for å bruke dette?? Har ikke vært borti string enda =/ #include <string> using namespace std; Lenke til kommentar
abcd423417984 Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 (endret) Hele koden (som er testet og virker) kommer her: #include <iostream> #include <string> using namespace std; bool Palindrom(const string & str) { bool pal = true; size_t x = 0, y = str.size()-1; while(x < y) { if(str[x] != str[y]) pal = false; ++x; --y; } return pal; } int main() { string str = "otto"; cout << (Palindrom(str) ? "palindrom" : "IKKE palindrom") << endl; system("PAUSE"); } Bare bruk den ToString koden så virker det. Kan godt hende det er en mer fancy måte å løse det på, men denne virker ihvertfall på bokstaver Endret 10. januar 2005 av invictus Lenke til kommentar
søppel Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 (endret) Her er en annen: #include <iostream> #include <sstream> template<typename T1, typename T2> inline T1 toType(T2 const& source) { std::stringstream oss; oss << source; T1 target; oss >> target; return(target); } // toType // Intrusive (faster) version. template<typename T1, typename T2> inline void toType(T2 const& source, T1& target) { std::stringstream oss; oss << source; oss >> target; } // toType std::string reverse(std::string const& s) { std::string ret = ""; // Yup - since we're inserting. unsigned int const n = s.length(); for(unsigned int i = 0; i < n; i++) ret.insert(0, 1, s[i]); return(ret); } // reverse // Intrusive (faster) version. void reverse(std::string const& s, std::string& ret) { ret = ""; // Yup - since we're inserting. unsigned int const n = s.length(); for(unsigned int i = 0; i < n; i++) ret.insert(0, 1, s[i]); } // reverse template<typename T> bool palindrome(T const& o) { std::string tmp = toType<std::string>(o); return(tmp == reverse(tmp)); } // palindrome using namespace std; int main() { int i = 1221; if(palindrome(i)) { cout << i << " is a palidrome." << endl; } else { cout << i << " is not a palidrome." << endl; } string s = "abba"; if(palindrome(s)) { cout << s << " is a palidrome." << endl; } else { cout << s << " is not a palidrome." << endl; } if(palindrome("abbaa")) { cout << "abbaa" << " is a palidrome." << endl; } else { cout << "abbaa" << " is not a palidrome." << endl; } return(0); } // main Edit: La til "intrusive" versjoner ... Edit2: rettet teit feil Endret 10. januar 2005 av søppel Lenke til kommentar
Zethyr Skrevet 10. januar 2005 Forfatter Del Skrevet 10. januar 2005 (endret) #include <cstdlib> #include <iostream> #include <string> using namespace std; string palstr; long double ans = 0; int x = 0; int y = 0; bool Palindrom(const string & str){ bool pal = true; size_t x = 0, y = str.size()-1; while(x < y) { if(str[x] != str[y]) pal = false; ++x; --y; } return pal; } string ToString(unsigned int tall) { string ret; while(tall != 0) { ret = char((tall % 10) + 0x30) + ret; tall /= 10; } return ret; } int main(int argc, char *argv[]) { while(x<1000){ y = 0; while(y<1000){ palstr = ToString(x*y); if(Palindrom(palstr)) ans += x*y; y++; } x++; } cout<<ans<<"\n"; system("PAUSE"); return EXIT_SUCCESS; } Denne skal teste alle produkter av x og y, når de varierer mellom 0 og 1000, og summere alle produktene som er palindromer... Programmet krasjer under kjøring, og gir meg en hel masse unyttig info, kanskje litt nyttig. Any ideas? (Å sette sammen kode som andre har hjulpet til med er ikke lett =/) Edit: si fra hvis dere vil ha et utsnitt av erroren Endret 10. januar 2005 av Zethyr Lenke til kommentar
søppel Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 (endret) #include <iostream> #include <sstream> template<typename T1, typename T2> inline T1 toType(T2 const& source) { std::stringstream oss; oss << source; T1 target; oss >> target; return(target); } // toType // Intrusive (faster) version. template<typename T1, typename T2> inline void toType(T2 const& source, T1& target) { std::stringstream oss; oss << source; oss >> target; } // toType std::string reverse(std::string const& s) { std::string ret = ""; // Yup - since we're inserting. unsigned int const n = s.length(); for(unsigned int i = 0; i < n; i++) ret.insert(0, 1, s[i]); return(ret); } // reverse // Intrusive (faster) version. void reverse(std::string const& s, std::string& ret) { ret = ""; // Yup - since we're inserting. unsigned int const n = s.length(); for(unsigned int i = 0; i < n; i++) ret.insert(0, 1, s[i]); } // reverse template<typename T> bool palindrome(T const& o) { std::string tmp = toType<std::string>(o); return(tmp == reverse(tmp)); } // palindrome using namespace std; int main() { unsigned long ans = 0; for(unsigned y = 0; y < 1000; y++) for(unsigned x = 0; x < 1000; x++) { cout << "x: " << x << " Y: " << y << " pal(" << x * y << "): " << palindrome(x * y) << " ans: " << ans << endl; if(palindrome(x * y)) ans += x * y; } return(0); } // main Edit:rettet Endret 10. januar 2005 av søppel Lenke til kommentar
Zethyr Skrevet 10. januar 2005 Forfatter Del Skrevet 10. januar 2005 (endret) Takk Men jeg er allikevel nysgjerrig på hva som gikk galt på det forrige... hmm =/ Greit å lære seg det, så jeg ikke går i samme felle senere. Søppel: Jeg får feil svar i forhold til fasit... hmm Edit² : gidder du å sette et par comments der hvor du har gjort forandringer? Endret 10. januar 2005 av Zethyr Lenke til kommentar
søppel Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 (endret) Skal være rettet nå - var en "bøgg" der. Jeg har ikke tid å se på den forrige nå - kan ta en titt siden hvis det ikke ordner seg. Edit: cout'en i "hovedloopen" er litt uheldig plassert med tanke på ans, men du skjønner greia. Om du er ute etter hastighet bør funskjonene inlines. (husk å kompilere med minimum -O2 for at dette skal tre i kraft) Håper den gir ut riktig svar nå da .. Endret 10. januar 2005 av søppel Lenke til kommentar
Zethyr Skrevet 10. januar 2005 Forfatter Del Skrevet 10. januar 2005 Edit: cout'en i "hovedloopen" er litt uheldig plassert med tanke på ans, men du skjønner greia. Ja, jeg skjønner greia. Om du er ute etter hastighet bør funskjonene inlines. Ja, skjønner det også. Såpass små funksjoner bør nesten alltid være inline. (husk å kompilere med minimum -O2 for at dette skal tre i kraft) Wtf ? Snakker vi om DevC++ under WinXp nå ?? Eller gcc e.l. under en eller annen platform som jeg aldri har skrevet kode for/under?? Gi meg en URL eller en kort oppsummering hvis du har tid. Håper den gir ut riktig svar nå da .. Den gir riktig svar nå, ja Lenke til kommentar
søppel Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 (endret) Snakket om GCC, som kalles MinGW under Windows. Så det jeg sa gjelder under flere platformer. IDE'et Dev-C++ bruker MinGW som kompiler. http://www.network-theory.co.uk/docs/gccin...ccintro_39.html ..og ellers, under "Documentation": http://gcc.gnu.org/ http://gcc.gnu.org/onlinedocs/gcc/Optimize...ptimize-Options Endret 10. januar 2005 av søppel Lenke til kommentar
Dead_Rabbit Skrevet 10. januar 2005 Del Skrevet 10. januar 2005 g++ program.cpp -O2 program Eller, hvis du vil optimalisere enda mer: g++ program.cpp -O3 program Lenke til kommentar
☀ ❄ Skrevet 11. januar 2005 Del Skrevet 11. januar 2005 g++ program.cpp -O2 program Eller, hvis du vil optimalisere enda mer: g++ program.cpp -O3 program Rettere sagt: g++ -o program program.cpp -O2 Lenke til kommentar
Zethyr Skrevet 11. januar 2005 Forfatter Del Skrevet 11. januar 2005 ... jeg pleier å trykke på knappen 'compile and run' Har man noen valg i devC++ hvor man kan gi parametre til kompilatoren?? *utforske devcpp... Lenke til kommentar
søppel Skrevet 11. januar 2005 Del Skrevet 11. januar 2005 (endret) Jeg har ikke Windows eller Dev-Cpp her, men minns dette er mulig ja. En dialog med noe slikt i: "Compiler options: -O2 -g -Wall" Edit: -Wall er kjekk, da den kan gi deg hint om potensielle problemer. Det finnes mange andre "advarsel-parametere" man kan gi til gcc .. sjekk doc'sa .. :] Endret 11. januar 2005 av søppel Lenke til kommentar
Legion Skrevet 11. januar 2005 Del Skrevet 11. januar 2005 en annen måte å løse et dette på er å bruke en stack. push tall/bokstav på stacken fram til midten av tallet/ordet, så pop de av dersom de er like. dersom stacken er tom etter kjøring, så er det et palindrom. en bloatløsning såklart, men greit konsept. Lenke til kommentar
kingkong Skrevet 11. januar 2005 Del Skrevet 11. januar 2005 Enda et forslag (på det opprinnelige problemet)... #include <stdio.h> // 10^n-funksjon int ten_to_the (int n) { return (n==0?1:10*ten_to_the(n-1)); } int paladidumdidam (int a, int l, int l2) { return (l==0?1:(a/ten_to_the(l-1))%10!=(a/ten_to_the(l2-l))%10?0:paladidumdidam(a,l-1,l2)); } int main (int argc, char** arg) { int anttall = 12; int tall[] = {1211, 31211, 1234321, 121, 98789, 1716171, 1233456, 8668, 8669, 1221, 9, -1001}; int i; for (i=0; i<anttall; i++) { int j; for (j=0; ten_to_the(j)<tall[i]; j++); printf ("Er %i et paladidumdidam-tall? %s\n", tall[i], (paladidumdidam(tall[i],j,j)?"Ja":"Nei")); } } Lenke til kommentar
søppel Skrevet 11. januar 2005 Del Skrevet 11. januar 2005 Snakk om "obfuscated" kode! :] (C++'s templates er ikke akkurat ryddige de heller .. var ikke det liksom) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå