Ir ao conteúdo
  • Cadastre-se

Programa em C++


Posts recomendados

Camaradas, estou empacado em um exercício aqui da facul. N consigo determinar uma condição para o segundo while do código abaixo, que faça o programa funcionar direito, poderiam me ajudar?

O objetivo do programa é ler um intervalo de numeros e classificar os numeros do intervalo em perfeitos ou não perfeitos, usando como comando de laço de repetição somente o while.

 

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int a=0,b=0,c=0,d=1,e=0,f=0,cont=1;
    cout<< "Exercicio 11.\n";
    cout<< "\nDigite o primeiro termo do intervalo de numeros desejado.\n";
    cin>> a;
    cout<< "\nDigite o ultimo termo do intervalo desejado.\n";
    cin>> b;
    while(cont <= B)
    {
               while()
               {
                  c = a % d;
                  if(e == 0)
                  {
                          f = d;
                          d = d + 1;
                          e = e + f;
                          }
                  else if( c != 0 )
                  {
                       d = d + 1;
                       }
                  }
               if(e == a)
               {
                    cout<< "\nO numero " << a << " é perfeito.";
                    }
                    else
                    {
                        cout<< "\nO numero " << a << " nao é perfeito.";
                        }
    cont = cont + 1;
    a = a + 1;
    }
    cout<< "\n\n";
    system("PAUSE");
    return EXIT_SUCCESS;
}
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@CeifadorDburgues      o que você quer dizer com um número perfeito e não 

perfeito, não entendi .      Mas se você quer que seu programa seja executado 

coloque a condição no segundo while assim  c=0, ele vai funcionar mas não sei

se é o resultado certo .  aqui seu código já modificado:

#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    int a=0,b=0,c=0,d=1,e=0,f=0,cont=1;
    cout<< "Exercicio 11.\n";
    cout<< "\nDigite o primeiro termo do intervalo de numeros desejado.\n";
    cin>> a;
    cout<< "\nDigite o ultimo termo do intervalo desejado.\n";
    cin>> b;
    while(cont <= b)
    {
               while(c=0)
               {
                  c = a % d;
                  if(e == 0)
                  {
                     f = d;
                     d = d + 1;
                     e = e + f;
                  }
                  else if( c != 0 )
                  {
                    d = d + 1;
                  }
               }
               if(e == a)
               {
                  cout<< "\nO numero " << a << "  perfeito.";
               }
               else
               {
                 cout<< "\nO numero " << a << " nao  perfeito.";
               }
               cont = cont + 1;
               a = a + 1;
    }
    cout<< "\n\n";
    system("PAUSE");
    return EXIT_SUCCESS;
}

 

Link para o comentário
Compartilhar em outros sites

Camarada, um numero perfeito é aquele cujo a soma de seus divisores inteiros, com exceção dele mesmo, é igual a ele mesmo. Por exemplo:

 

28 = 1 + 2 + 4 + 7 + 14

 

O problema do programa está na condição do while. A variavel d(divisor) continua aumentando seu valor mesmo após ter atingido o valor do ultimo divisor do numero perfeito em questão, assim classificando todos os numeros em questao como imperfeitos. No caso do numero 28, o programa continua aumentando o valor da variavel d, após a mesma ter atungido o valor 14, e somando o resultado da divisão com o resto dos numeros. A variavel q armazena os resultados das somas é  a  e.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Veja se é isso

 

Para validar o funcionamento eu coloquei para verificar os números perfeitos de 1 a 500 e ele mostrou o 6, 28 e 496 comprovando o funcionamento do código.

 

#include <iostream>

int main ()
{
    int i, j, ini, fim, soma=0;

    std::cout << "Digite o primeiro termo do intervalo de numeros desejado: ";
    std::cin >> ini;
    std::cout << "Digite o ultimo termo do intervalo desejado: ";
    std::cin >> fim;

    i = ini;
    while(i <= fim)
    {
        soma = 0;
        i++;

        j = 1;
        while( j < i)
        {
            if ((i%j)==0)
            soma = soma + j;
            j++;
        }
        if(soma==i)
        {
            std::cout << i << " e um numero perfeito" << "\n";
        }
        else if(soma != i)
        {
            std::cout << i << " nao e um numero perfeito" << "\n";
        }
        i++;
    }
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Eu cheguei a fazer um algoritmo de número perfeito em C a um tempo atrás, veja se pode ajudar de alguma forma:

 

#include <stdio.h>
#define T 4 /*Coloque aqui quantos numeros perfeitos necessita*/
#define TRUE 1

int soma_divisores(int);
int valida_numero_perfeito(int, int);

int main(void){

    int vet[T];
    int i, j;
    int numero_teste;

    j = 0;

    for(i = 4; j < T; i++){ /*2 e 3 sao primos*/
        numero_teste = soma_divisores(i);
        if(valida_numero_perfeito(numero_teste, i)){
            vet[j] = i;
            j++;
        }
    }

    printf("Os numeros perfeitos sao: \n");
    for(i = 0; i < T; i++){
        printf("%d\n", vet[i]);
    }

return 0;
}

int soma_divisores(int num){

    int i, soma;

    soma = 0;

    for(i = 1; i <= num / 2; i++){
        if(!(num % i)){
            soma += i;
        }
    }

return soma;
}

int valida_numero_perfeito(int soma, int num){
    return soma == num;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Contribuindo um pouco com a galera, segue meu rascunho:

#include <stdio.h>//io
#include <string.h>//memset

#define MOSTRAR_NPERFEITO false//mostrar ou nao os que nao sao perfeitos


/* Prototipo - função principal */
bool perfn(int);
	
	
	
/* Inicialização */
int main(void){
	int n = 0, nMax = 0, p = 0;
	
	//Entrada
	printf("Digite um numero maximo: ");
	scanf(" %d",&nMax);
	
	n = nMax;
	while(n){
		//Resultado
		if(perfn(n)){
			printf("\n\n %d e perfeito!!\n",n);
			p++;
		}
		else{
			if(MOSTRAR_NPERFEITO)//se ativado, pode dar spam
			printf("\n%d nao e perfeito!\n",n);
		} 
		n--;
	}
	printf("\n\nNumeros perfeitos de %d a 0: %d\n\n", nMax, p);
	return 0;
}

/* Verifica se tal numero é perfeito */
bool perfn(int a){
	int aux = 0, i = 0;
	int vet[a];//vet[a], a = divisores possiveis
	memset(vet, 0, sizeof(vet));
	
	//Busca divisores 
	for(aux = a-1; aux; aux--){
		if(a % aux == 0){
			vet[i++] = aux;
		}
	}
	
	//Soma divisores
	for(i = 0, aux = 0; vet[i]; i++){
		aux+=vet[i];
	}
	
	//retorna resultado
	return (aux == a) ? true:false;
}

Quanto maior o numero da entrada, mais lento é a resposta.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Camaradas, obrigado pela ajuda.

Consegui rodar com o seguinte código:

 

 

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int a=0,b=0,d=2,e=0;
    cout<< "Exercicio 11.\n";
    cout<< "\nDigite o primeiro termo do intervalo de numeros desejado.\n";
    cin>> a;
    cout<< "\nDigite o ultimo termo do intervalo desejado.\n";
    cin>> b;
    while(a <= B)
    {
               while(d <= a)
               {
                  if((a%d) == 0)
                  {             
                        e = e + (a/d);
                  }
                  d = d + 1;
               }
 
               if(e == a)
               {
                    cout<< "\nO numero " << a << " é perfeito.";
               }
               else
               {
                        cout<< "\nO numero " << a << " nao é perfeito.";
               }
 
               a = a + 1;
               e = 0;
               d = 2;
    }
    cout<< "\n\n";
    system("PAUSE");
    return EXIT_SUCCESS;
}
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!