Jump to content

Dúvida código


polska

Recommended Posts

Submeti agora o Prime Palindromes da USACO, onde tinhamos de determinar todos os números primos e palindromes ao mesmo tempo de um determinado intervalo, e foi aceite. No entanto, fui ver a solução que eles colocaram na ANALYSIS e não percebi um bocado do código numa função...

void
gen(int i, int isodd)
{
char buf[30];
char *p, *q;
long n;

sprintf(buf, "%d", i);

p = buf+strlen(buf);
q = p - isodd;

while(q > buf)
*p++ = *--q;

*p = '\0';

n = atol(buf);

if(a <= n && n <= b && isprime(n))
fprintf(fout, "%ld\n", n);
}

Por exemplo, a função recebe o numero 100, e a var isodd 0, ou seja, vai gerar o palindrome 100001, o que eu não percebo é a seguir ao sprintf..

1º -> o buf fica com "100"

2º -> p = buf+strlen(buf) ??? Que valor resulta desta expressão? Não entendo quando vale buf...

3º -> *p++ = *--q; ele coloca o -- antes de q, que influencia vai ter isto em p?

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

São operações normais com ponteiros.

buf = "100"

p = buf + strlen(buf) <-> p = buf + 3 <-> p tem o endereço equivalente à posição buf[3] ( buf é equivalente a um ponteiro para a primeira posição do array)

*p++ = *--q;

é equivalente a

--q;

*p = *q;

p++;

fica mais claro assim? o p tem as posições onde vais colocando 0,0,1 para dar o append "001" e o q está a percorrer o "100" de trás para a frente.

Edited by mogers

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Sim, já entendi 🙂 , só não tenho a certeza de: p = buf + strlen(buf), p fica a 4 certo? (naquele caso)

nop ... sizeof (buf) = 30

logo p = posição de memória do ponteiro/lista buf + 30. o que equivale a ter

p = &(buf[30]);

o memso se aplica caso o array for de inteiros

int buf[30];
int size = sizeof (buf); // sizeof (int) * 30 = 120
int * p = buf + sizeof (buf); // buf + 120 == &(buf[120/sizeof(int)] == &(buf[30])
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Sim, já entendi 🙂 , só não tenho a certeza de: p = buf + strlen(buf), p fica a 4 certo? (naquele caso)

Não. p é um ponteiro, aponta para endereços de memória e não para indices 0...strlen(string)-1.

Visto que buf aponta para a posição 0, considerando a string "100", p aponta para a posição 3 desse array (como tinha dito "endereço de buf[3]" ou p = &buf[3]).

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.