Algebra em C/C++ [RESOLVIDO]

13. Re: Algebra em C/C++ [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/10/2015 - 16:14h

EnzoFerber escreveu:

Por exemplo, ele vai entrar em loop infinito se você passar os arguementos (...) 33 e 2 (não há dois primos que somados resultem em 33),
etc...


Como não? 2+31=33.


  


14. Re: Algebra em C/C++ [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 19/10/2015 - 16:16h

paulo1205 escreveu:

EnzoFerber escreveu:

Por exemplo, ele vai entrar em loop infinito se você passar os arguementos (...) 33 e 2 (não há dois primos que somados resultem em 33),
etc...


Como não? 2+31=33.


Ops, exemplo ruim! Esse exemplo não é impossível realmente, não atinei.
Mas o programa não calcula.
Como disse, está longe de ser eficiente.

Já editei o original e fiz referência a você. Obrigado pela correção.


$ cat codigo.c | indent -kr -i8
$ man indent

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." - linux/Documentation/CodingStyle - TORVALDS, Linus.



15. Re: Algebra em C/C++ [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 19/10/2015 - 17:43h

Uma versão um pouco melhor:


/* prime_sum.c
*
* Enzo Ferber
* 2015
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define __INLINE__ __inline__ __attribute__((__always_inline__))

int __INLINE__ is_prime(int n)
{
int i;
for (i = 2; i < n; i++)
if (!(n % i)) return 0;
return 1;
}

int __INLINE__ prior_prime(int prime)
{
while(!is_prime(--prime)) ;
return prime;
}


int *new_array(int sum, int max)
{
int *p = malloc(max * sizeof *p);
register int i;
for (i = 0; i < max; i++)
p[i] = sum;
return p;
}

int __INLINE__ compute(int *array, int max)
{
int sum = 0;
register int i;
for (i = 0; i < max; i++)
sum += array[i];
return sum;
}

void build_sum_array(int *array, int sum, int max)
{
int *primes, *primes_aux, pp, i, j;

pp = *array;
primes = malloc(sum * sizeof *primes); /* overkill */
primes_aux = primes;
for(j = 0; pp > 1; j++)
primes[j] = pp = prior_prime(pp);

for(i = 0; i < max; i++) {
for (j = 0; j <= i; j++) {
pp = *primes;
while (array[j] > 1) {
if (compute(array, max) == sum) return;
array[j] = *primes++;
}
array[j] = pp;
primes = primes_aux;
}
if (i == max - 1 && compute(array, max) > sum) {
i = -1;
primes = ++primes_aux; /* leaking... */
}
}
}

int main(int argc, char *argv[])
{
if (argc < 3) return 0;

int sum = atoi(argv[1]);
int n = atoi(argv[2]);
int *array = new_array(sum, n);
register int i;

printf("%d as a sum of %d primes: \n", sum, n);
build_sum_array(array, sum, n);
if (compute(array, n) != sum) {
puts("Impossible");
return 0;
}

for (i = 0; i < n; i++)
printf("%-5d ", array[i]);

putchar('\n');
return 0;
}




$ cat codigo.c | indent -kr -i8
$ man indent

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." - linux/Documentation/CodingStyle - TORVALDS, Linus.



16. Re: Algebra em C/C++ [RESOLVIDO]

Nelson
Nelson_Nunes

(usa Slackware)

Enviado em 19/10/2015 - 18:21h

paulo1205 escreveu:

O mesmo autor da pergunta inicial do tópico já postou um outro tópico sobre particionamento (mas com parcelas que eram meramente números ímpares, não primos).

Acho essa questão de “na mesma ordem” meio inútil. Só se pode saber com certeza a ordem original se ela tiver sido guardada em algum lugar, quer por meio do armazenamento de cada parcela, quer pelo das somas parciais -- o que acaba dando na mesma.

Seria interessante ter acesso ao enunciado original da questão, bem como ao contexto do que o autor do tópico está estudando no momento. Pela outra questão e por esta, ele parece estar mexendo com pilhas ou com recursividade. A resposta “certa” pode ter a ver com o tema sob estudo.


Olá paulo1205 muito obrigado por esclarecer algumas dúvidas minha no post anterior, Concordo com você Quando você diz que só se pode saber a ordem original se ela tiver sido guardada em algum lugar(variável) pois a matemática já nos diz que a ordem dos fatores não alteram o produto, mas discordo com você quando você diz que acha meio inútil os valores terem que ser na ordem original, mas também respeito a sua valiosa opinião e mais uma vez obrigado, se eu consegui entender (Resolver) as minhas dúvidas neste post é porque tive tambem tive uma parcela de ajuda sua e do lcavalheiro.





17. Re: Algebra em C/C++ [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/10/2015 - 20:04h

Nelson_Nunes escreveu:

Olá paulo1205 muito obrigado por esclarecer algumas dúvidas minha no post anterior, Concordo com você Quando você diz que só se pode saber a ordem original se ela tiver sido guardada em algum lugar(variável) pois a matemática já nos diz que a ordem dos fatores não alteram o produto,


No caso, seria melhor dizer que a ordem das parcelas não altera a soma (propriedade comutativa da adição).

mas discordo com você (...)


Discordar comigo significa que ambos, juntos, discordamos da mesma coisa. Você provavelmente quis dizer que discorda _de_ mim.

(...) quando você diz que acha meio inútil os valores terem que ser na ordem original, mas também respeito a sua valiosa opinião


Provavelmente “inútil” foi um termo muito forte. O que eu quis dizer é que, além de muito pouco viável, provavelmente seria de muito pouco valor, justamente porque, na nossa Aritmética tradicional, toda soma pode ter parcelas comutadas, sem efeito sobre o resultado.

e mais uma vez obrigado, se eu consegui entender (Resolver) as minhas dúvidas neste post é porque tive tambem tive uma parcela de ajuda sua e do lcavalheiro.


Eu ainda gostaria de ver o enunciado original da questão, com todas as suas restrições. Um aspecto importante, por exemplo, é se pode haver parcelas repetidas.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts