Desenvolva um programa em C que informe todos os números amigos existentes entre 1 e 1.000

12 respostas Resolvido
c
H

Boa tarde, tudo bem?

Então galera meu professor pediu para a gente desenvolver um programa em C que encontre todos os pares de números amigos entre 1 e 1.000 (Para aqueles que não sabem o que é um numero amigo eu vou deixar a definição no fim do Tópico). Então eu desenvolvi o programa mas não esta dando o resultado esperado  que de 1 a 1.000 os únicos pares de números amigos existente é 220 e 284 e não são esses números que estão sendo impressos na tela. Enfim vou colar meu código aqui e gostaria que vocês me ajudassem a identificar onde esta o meu erro e corrigi-lo <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pnglight_smile.png?v=9" title=":slight_smile:" class="emoji" alt=":slight_smile:">

#include <stdio.h>

int main ()

{

int n1, divisor, r, soma1 = 0, somareal;

int n2, divisor2, r2, soma2 = 0,somareal2;
for (n1 = 1, n2 = 1; n1 <= 1000; n1++, n2++)
	{	
	
		for (divisor = 1, divisor2 = 1; divisor <= 1000; divisor++, divisor2++)
		{			
			if (n1 % divisor == 0)
			{
				r = n1 / divisor;
				soma1 += divisor;
				//printf("\nN1 = %d\t DIVISOR = %d\t N1 / DIVISOR = %d\n",n1, divisor, r);
			}
			if (n2 % divisor2 == 0)
			{
				r2 = n2 / divisor2;
				soma2 +=divisor2;
				//printf("\nN2 = %d\t DIVISOR2 = %d\t N2 / DIVISOR2 = %d SOMA = %d\n",n2, divisor2, r2, soma2);
			}
			
		}
		somareal = soma1 - n1;
		somareal2 = soma2 - n2;
		//printf("\nSOMA: %d\n",somareal);
		//printf("SOMA2: %d\n",somareal2);
		if (n1 == somareal2 && n2 == somareal)
		{
			printf("N1 %d e SOMA2 %d         ",n1,somareal2);
			printf("N2 %d e SOMA %d            SAO NUMEROS AMIGOS!\n",n2,somareal);
		}		
		//printf("\n--------------------------------------------\n");
		soma1 = 0;
		soma2 = 0;
	}
	
	
	return 0;
}

DEFINIÇÃO DE NÚMEROS AMIGOS:
Números amigos são dois números que estão ligados um ao outro por uma propriedade especial: cada um deles é a soma dos divisores do outro. (Um divisor de um número natural são os algarismos que dividem o número em partes exatamente iguais. Os divisores de 6, por exemplo, são 1, 2 e 3.) O menor par de números amigos é (220, 284). Os divisores de 220 são 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 e 110, cuja soma é 284; e os divisores de 284 são 1, 2, 4, 71 e 142, cuja soma é 220. Os números amigos eram conhecidos pelos Pitagóricos, que acreditavam que eles possuíam propriedades místicas.

12 Respostas

darlan_machado

Implementando em java, saiu isso:

package amigos;

public class Amigos {

	public static void main(String[] args) {
		int n1 = 0, n2 = 0;
		for(int i = 1; i <= 1000; i++) {
			for(int j = 1; j <= 1000; j++) {
				if(definePar(i, j) && (i != j)) {
					n1 = i;
					n2 = j;
					break;
				}
			}
		}
		System.out.printf("O número %d e o número %d são amiguxos", n1, n2);		
	}

	public static boolean definePar(int num1, int num2) {
		int somaNum1 = 0, somaNum2 = 0;
		for(int i = 1; i < num1; i++) {
			if(num1 % i == 0) {
				somaNum2 += i;
			}
		}
		
		if(somaNum2 != num2) {
			return false;
		}
		
		for (int i = 1; i < num2; i++) {
			if(num2 % i == 0) {
				somaNum1 += i;
			}
		}
		
		if(somaNum1 != num1) {
			return false;
		}
		return true;
	}
}
H

Oi Darlan, tudo bem?
Em java deu certo?
(e vc sabe como passar pra C?)

darlan_machado

Claro que deu, os números apresentados foram 220 e 284.
Passar para C é tua parte, né? Mesmo por que, é muito parecido, tirando a questão dos métodos (em C são funções).
Você vai precisar deduzir um pouco, mas, creio que consiga.

H

Não tem como você me dizer só qual parte do meu código esta errado? (Pf, eu realmente não entendo nada de java (ainda) então isso que você escreveu ai é como se fosse lingua Koreana pra mim)

darlan_machado
Solucao aceita

Isso aqui não está diferente de nada que você não tenha visto ou possa fazer em C…

int n1 = 0, n2 = 0;
		for(int i = 1; i <= 1000; i++) {
			for(int j = 1; j <= 1000; j++) {
				if(definePar(i, j) && (i != j)) {
					n1 = i;
					n2 = j;
					break;
				}
			}
		}

E tem muitas partes do código que, da mesma maneira, não possuem diferenças.

H

@darlan_machado Eu meio que entendi o seu code só e consegui fazer as adaptações necessárias, no entanto ainda há um erro a minha resposta esta se repetindo 2 vezes, como se pode ver na imagem abaixo:


a alteração que eu fiz foi separar o contador, pra contar no seu próprio for, em vez de ficar assim:

for (n1 = 1, n2 = 1; n1 <= 1000; n1++, n2++)

ficou assim:

for (n1 = 1; n1 <= 1000; n1++)

{	

for (n2 = 1; n2 <= 1000; n2++)

E esta outra parte do código, em vez de ficar assim:

if (n1 == somareal2 && n2 == somareal)

{

printf("N1 %d e SOMA2 %d         ",n1,somareal2);

printf(N2 %d e SOMA %d            SAO NUMEROS AMIGOS!\n”,n2,somareal);

}

ficou assim:

if (n1 == somareal2 && n2 == somareal && n1 != n2)

{

//printf("N1 %d e SOMA2 %d         ",n1,somareal2);

printf(N1 %d e N2 %d            SAO NUMEROS AMIGOS!\n”,n1,n2);

}

Onde eu devo corrigir?

darlan_machado

Por que duplica:? a condição que apliquei foi de parar quando encontrasse a execução correta:

if(definePar(i, j) && (i != j)) {
					n1 = i;
					n2 = j;
					break;
				}

Obviamente vai haver repetição, afinal, os valores são os mesmos.
Como você poderia corrigir?
Validando se os valores de n1 e n2 não são iguais:

if((i == n1 || i == n2) && (j == n1 || j == n2)) {
    continue;
}

Java, PHP, C# possuem, obviamente, suas particularidades. Porém, são linguagens que seguem o que chamamos de sintaxe de C. O que facilita muito a troca de uma para outra.

H

@darlan_machado olha eu entendi que você deu o comando pra parar mas oque eu não entendo é onde eu devo dar a ordem para o meu parar porque por exemplo o seu printf em java vem antes do meu em C ai fiquei meio confuso a respeito da ordem e também não meu professor ainda não entro no comando break.
Da pra explicar de novo por favor?

darlan_machado

Eu já apresentei o if… se isso não resolver, então você precisa ser mais criativo.

H

@darlan_machado
Ok, vou tentar aqui.
Mas obrigado ajudou bastante.

sonhodedev

Tenta usar 3 fors, não sei ajudar nesse caso, não programo em c faz tempo, agora só em java.

darlan_machado

Não precisa de 3 fors, apenas dois encadeados resolvem o problema.
A questão não está nos fors e sim em como controlar e identificar quais são “amigos” e quais não são.

Criado 29 de outubro de 2019
Ultima resposta 29 de out. de 2019
Respostas 12
Participantes 3