polska Posted July 25, 2012 at 03:36 PM Report Share #470282 Posted July 25, 2012 at 03:36 PM (edited) 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 July 25, 2012 at 03:39 PM 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 More sharing options...
mogers Posted July 25, 2012 at 05:01 PM Report Share #470301 Posted July 25, 2012 at 05:01 PM (edited) 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 July 25, 2012 at 05:01 PM 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 More sharing options...
polska Posted July 25, 2012 at 05:07 PM Author Report Share #470303 Posted July 25, 2012 at 05:07 PM Sim, já entendi 🙂 , só não tenho a certeza de: p = buf + strlen(buf), p fica a 4 certo? (naquele caso) 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 More sharing options...
HappyHippyHippo Posted July 25, 2012 at 05:10 PM Report Share #470305 Posted July 25, 2012 at 05:10 PM (edited) 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 July 25, 2012 at 05:12 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
mogers Posted July 25, 2012 at 05:14 PM Report Share #470306 Posted July 25, 2012 at 05:14 PM 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 More sharing options...
polska Posted July 25, 2012 at 05:49 PM Author Report Share #470311 Posted July 25, 2012 at 05:49 PM Certo! Obrigado 🙂 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 More sharing options...
Dr_Lion Posted July 27, 2012 at 02:49 PM Report Share #470651 Posted July 27, 2012 at 02:49 PM Strlen, devolve o número de caracteres de uma string, até ser encontrado um \0, sem contar com este. O sizeof devolve o tamanho de uma variável em bytes. Em strings um char corresponde a 1byte. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now