Ir ao conteúdo

Posts recomendados

Postado

Olá, estou tendo problema com dois problemas e já revisei eles várias vezes até vir postar algo aqui.

O primeiro é o problema da conjectura de Goldbach (Que fala que todo número par é a soma de dois números primos). No programa a entrada deve conter o número a ser verificado e a saída são os dois números primos que sua soma resulta no número que foi colocado pelo usuário para ser verificado.

O segundo é um simples programa para verificar se um número é perfeito ou não. (Definição de número perfeito: A soma dos seus divisores resulta nele mesmo. Por exemplo: 6: 3 + 2 + 1 = 6).

Códigos:

1.

#include <stdio.h>
#include <stdlib.h>

int primo (int n) { // A função retorna 1 se o número for primo e 0 se a sentença não for verdadeira.
int r = 0, i = 2;
for (i = 2; i < n/2; i++) {
if (n % i == 0) {
r = 0;
}
else {
r = 1;
}
}
return r;
}

void Goldbach (int P) {
int p1 = P, p2 = 0, var = 0;
while (var == 0) {
p1--;
p2++;
if (primo(p1) == 1 && primo(p2) == 1) {
var = 1;
}
}
printf ("%d\n%d\n", p2, p1);
getchar();
}

int main (void) {
int N;
scanf ("%d", &N);
while (N % 2 != 0) {
scanf ("%d", &N);
}
Goldbach(N);
getchar();
return(0);
}

2.


#include <stdlib.h>
#include <stdio.h>

void numeroPerfeito (int n) {
int somaDivisores, divisor = n/2;
while (divisor != 0) {
if (n % divisor == 0) {
somaDivisores += divisor;
}
divisor--;
}
if (n == somaDivisores) {
printf ("S\n");
}
if (n != somaDivisores) {
printf ("N\n");
}
}

int main (void) {
int n;
scanf ("%d", &n);
numeroPerfeito(n);
return(0);
}

[]'s. ^_^

@Edit: Postei aqui por que os dois programas estão dando saídas erradas, logo o problema está no algoritmo. Outra coisa: eu postei aqui por que eu não quero pegar um algoritmo pronto. Quero dicas de como consertar o meu. Obrigado.

  • 4 anos depois...
Postado

Acredito que ainda há pessoas que tenham bastante problema com este algoritmo, abaixo minha resolução e um vídeo com as explicações.

 

#include <stdio.h>
#define MIN 700
#define MAX 1100
#define TRUE 1
#define FALSE 0

int confirma_goldbach(int);
int e_primo(int);
int mostra_goldbach(int, int, int);

int main(){

    register int i;

    for(i = MIN; i <= MAX; i += 2){
        if(confirma_goldbach(i))
            continue;
    }


return 0;
}

int confirma_goldbach(int num){

    register int i, j = 2;

    for(i = 2; i + j <= num; i++){
        if(e_primo(i))
            for(j = 2; j < num; j++){
                if(e_primo(j)){
                    if(mostra_goldbach(i, j, num))
                        return TRUE;
                }
            }
            j = 2;
    }

return FALSE;
}

int e_primo(int num_teste){

    register int i, cont_div;

    cont_div = num_teste == 1 ? 1 : 2;

    for(i = 2; i <= num_teste / 2; i++){
        if(num_teste % i == 0){
            cont_div++;
            break;
        }
    }

return (cont_div == 2 ? TRUE : FALSE);
}

int mostra_goldbach(int primo1, int primo2, int num_teste){

    if(primo1 + primo2 == num_teste){
        printf("%3d + %3d = %3d\n", primo1, primo2, num_teste);
        return TRUE;
    }
    else{
        return FALSE;
    }
}

 

 

 

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...