[ --daniel-- @ 25.09.2006. 22:02 ] @
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]
[ NrmMyth @ 26.09.2006. 09:46 ] @
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]
[ Mali Misha @ 26.09.2006. 20:38 ] @
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.
[ --daniel-- @ 27.09.2006. 01:02 ] @
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
[ Mali Misha @ 27.09.2006. 08:54 ] @
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.
[ --daniel-- @ 27.09.2006. 10:25 ] @
da mislio sam minimalni palindrom iza bilo kojeg broja...ali to ču ja sredit malo pa če radit ;).hvala
[ Mali Misha @ 27.09.2006. 14:13 ] @
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š.
[ --daniel-- @ 28.09.2006. 23:24 ] @
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);
}