Gå til innhold

Finne ut om et nummer er palindromt (c++)


Anbefalte innlegg

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 :D

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 av Zethyr
Lenke til kommentar
Videoannonse
Annonse

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 av invictus
Lenke til kommentar

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 av søppel
Lenke til kommentar

#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 av Zethyr
Lenke til kommentar

#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 av søppel
Lenke til kommentar

Takk :D

 

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 :dontgetit:

 

Edit² : gidder du å sette et par comments der hvor du har gjort forandringer?

Endret av Zethyr
Lenke til kommentar

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 av søppel
Lenke til kommentar

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 :D

Lenke til kommentar

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 av søppel
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...