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

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 já 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 :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.

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;
	}
}

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

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.

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)

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.

1 curtida

@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?

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.

1 curtida

@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?

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

1 curtida

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

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

1 curtida

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.

1 curtida