Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

prvi idući palindrom

[es] :: C/C++ programiranje :: prvi idući palindrom

[ Pregleda: 3026 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

--daniel--

Član broj: 82022
Poruke: 48
*.cmu.carnet.hr.



Profil

icon prvi idući palindrom25.09.2006. u 22:02 - pre 214 meseci
program treba traziti prvi sljedeći broj-palindrom(broj koji je od naprjed i nazad jednak pr: 808,2222, 78987..)
-ucitam broj od kojeg program pocinje trazit i kada program treba traziti trazi i nadje ga ali onda dolazi do greške i neče vratiti taj broj. u kojem djelu sam pogrješio?

ovo nije bas sto trebam, trebam efikasnije rješenje ili bar ideju?..jer ovo je jako sporo a i neradi sa velikim brojevima od recimo 100000 znamenaka..znači tu bi trebalo učitati string...

Code:

long trazi(long d)
{
    d++;
    while (palin(d)!=1)
    {        
        d++;
    }
    return d;
}

int palin(long a)
{
 
   int l;
   int p;
   char s1[10];
   
   ltoa(a,s1,10);
   l=strlen(s1);

   for(p=0;p<l;p++)
   {
        if(s1[p]!=s1[l-p-1])
             return 0;
   }
   return (1);

}


[Ovu poruku je menjao --daniel-- dana 25.09.2006. u 23:17 GMT+1]
Tko radi taj i griješ, a tko ne radi već pravi jednu pogrešku!!
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: prvi idući palindrom26.09.2006. u 09:46 - pre 214 meseci
Evo ti ideja, pa pogledaj:

342525243 (3425-2-5243) - neparni palindrom
3425-2 => 34252 => ++34252 => 34253 => 3425-3 => 3425-3-5243


3425225243 (34252-25243) - parni palindrom
34252 => ++34252 => 34253 => 34253 => 34253-35243


... tema bi trebala ici u "Art of programming"

[Ovu poruku je menjao NrmMyth dana 26.09.2006. u 22:18 GMT+1]
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: prvi idući palindrom26.09.2006. u 20:38 - pre 214 meseci
Slažem se oko premeštanja.

Ako ideš na veoma velike brojeve, korišćenje stringova je solidan izbor.

// Na prvi pogled:
Ako nista ne propustam, najmanji brojevni palindrom od n cifara je , gde je broj nula n-2.

Kada se neki brojevni palindrom dužine n uvećava, tako da se uveća što manje a pritom ostane palindrom, trebalo bi prvo pokušati uvećanje za 1 elementa (kod neparne dužine) odnosno elemenata (kod parne dužine) u sredini palindromovog zapisa.

Ako su elementi (odnosno elemenat) jednaki 9, treba pokusati sa sledećim parom, najbližim centru posle aktuelnog para odnosno elementa i tako u krug.

Ako se nađe par elemenata (odnosno elemenat) manji od 9, uvećati ga za 1 i sve elemente između (ukoliko ih ima) pretvoriti u nule.

Ako se ne nađe par elemenata (odnosno elemenat) manji od 9, palindrom postaje minimalni palindrom dužine n+1.
Ipak se ++uje.
Prikačeni fajlovi
 
Odgovor na temu

--daniel--

Član broj: 82022
Poruke: 48
*.cmu.carnet.hr.



Profil

icon Re: prvi idući palindrom27.09.2006. u 01:02 - pre 214 meseci
hvala..mislio sam ja na tako nešto ali ovo rješenje je dobro..nego primjetio sam kad sam samo naprvio u tvom kodu da kad je ručni unos nekog broja i ne radi najbolje...npr in: 56 out: 67; in 456 out 466

Tko radi taj i griješ, a tko ne radi već pravi jednu pogrešku!!
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: prvi idući palindrom27.09.2006. u 08:54 - pre 214 meseci
Brojevi 56 i 67 nisu palindromi. Kako ove funkcije pretpostavljaju (ali ne proveravaju) da li je ulazni string palindrom, ne može se od njih ocekivati da od nekorektnog ulaza daju korektan izlaz.

Recimo da sam, pored očekivanja boljih rešenja, tebi ostavio da tu negde u kodu uradiš kontrolu regularnosti ulaznog stringa ili ako si pak mislio da treba generisati minimalni palindrom koji se nalazi nakon nekog proizvoljno zadatog broja, onda ćeš morati još malo da poradiš na kodu.
Ipak se ++uje.
 
Odgovor na temu

--daniel--

Član broj: 82022
Poruke: 48
*.cmu.carnet.hr.



Profil

icon Re: prvi idući palindrom27.09.2006. u 10:25 - pre 214 meseci
da mislio sam minimalni palindrom iza bilo kojeg broja...ali to ču ja sredit malo pa če radit ;).hvala
Tko radi taj i griješ, a tko ne radi već pravi jednu pogrešku!!
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: prvi idući palindrom27.09.2006. u 14:13 - pre 214 meseci
Aha, evo ideje.

// netestirano
Imaš broj, na primer:

123456789

Sada ti od njega treba palindrom. Pa napravimo ga. Uzmu njegovu levu polovinu i projektuj je na desnu.

1234-5-6789 -> 1234-5-4321 -> 123454321

Sada, ukoliko je generisani palindrom veci od pocentog broja, onda bi to trebalo da bude to. Palindrom je nađen.
Ukoliko je palindrom manji od početnog broja, što je sada slučaj, trebalo bi naći sledeći palindrom po algoritmu odozgo:

123454321 -> 123464321.

Ovaj je veći od polaznog broja i palindrom je. Verovatno je i rešenje koje tražiš.
Ipak se ++uje.
 
Odgovor na temu

--daniel--

Član broj: 82022
Poruke: 48
*.cmu.carnet.hr.



Profil

icon Re: prvi idući palindrom28.09.2006. u 23:24 - pre 214 meseci
evo mislim da je ovo nešto na tu ideju, samo što nije dokraja napisano, jer treba uredit kada se radi o tome da treba povecati 9...sa večinom primjera radi jedino nevaljaju primjeri sa devetkama ili okrugli (pr na koje nedaje točno: 10000000, 999999, i u tom stilu)...
recimo za unos: 99999
ispis: 99:99 (a treba 100001)
za unos: 1000000
ispis: 1001001 (a treba 1000001)

..ostalo valja ;) i tak..pa onda pomagajte..
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>

void paran(char strn[1000000]);
void neparan(char strn[1000000]);

main()
{
    char str[1000000];
    int n,i,j;

    scanf("%d",&n);
    for (i=0;i<n;i++){
        scanf("%s",&str);
        if (strlen(str)%2==0){
            paran(str);
        }
        else
            neparan(str);
    }    
    system("pause");
    return 0;
}


void paran(char strn[1000000])
{
    int len;
    int i,j;    
    len=(strlen(strn)/2);
    
    for (i=len-1;i>=0;i--)
    {
        strn[2*len-i-1]=strn[i];
    }

    for (i=len;i<strlen;i++)
    {
        if (strn[i]<=strn[i]){
        
            ++strn[len-1];
            ++strn[len];
            break;
        }
        
        else
            break;
    }
    printf("%s\n",strn);
    
}

void neparan(char strn[1000000])
{
    int len;
    int i;
    len=strlen(strn)/2;

    for (i=len-1;i>=0;i--)
    {
        strn[2*len-i]=strn[i];
    }

    for (i=len-1;i<strlen;i++)
    {
        if (strn[i]<=strn[i]){
            ++strn[len];
            break;
        }
        else
            break;
    }
    
    printf("%s\n",strn);
}

Tko radi taj i griješ, a tko ne radi već pravi jednu pogrešku!!
 
Odgovor na temu

[es] :: C/C++ programiranje :: prvi idući palindrom

[ Pregleda: 3026 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.