removido
(usa Nenhuma)
Enviado em 15/05/2016 - 19:39h
Fiz questão de acertar a tabulação.
Seu programa aparentemente está correto.
Ele pesquisa números amigos.
Você sabe o que são números amigos?
Estranho que me parece a definição dada por este programa.
No caso o erro é dado quando não se passam parâmetros através da linha de comando do programa. Por exemplo, vamos chamar o programa de soma, porque eu sei que tem uma função dentro dele chamada soma e não tenho a menor ideia para o quê este programa serve. Executando o programa assim
./soma
dá erro porque o programa não tem tratamento de erro para quando não há parâmetros passados. Agora se for executado
./soma 1 500
são passados dois parâmetros: 1 e 500. E a saída do programa é
Os numeros 28 e 6 são mutuamente amigos.
Os numeros 496 e 6 são mutuamente amigos.
Os numeros 234 e 12 são mutuamente amigos.
Os numeros 496 e 28 são mutuamente amigos.
Os numeros 140 e 30 são mutuamente amigos.
Os numeros 224 e 40 são mutuamente amigos.
Os numeros 308 e 66 são mutuamente amigos.
Os numeros 364 e 78 são mutuamente amigos.
Os numeros 200 e 80 são mutuamente amigos.
Os numeros 270 e 84 são mutuamente amigos.
Os numeros 476 e 102 são mutuamente amigos.
Você precisaria tratar o programa com prevenção de erros como
* digitar nada na entrada
* digitar apenas um parâmetro
* digitar mais de dois parâmetros
* digitar coisas que não sejam números
* digitar valores negativos (há um cálculo de raiz quadrada no programa)
* digitar o menor e o maior valores em posições trocadas
* e mais algo que eu possa ter me esquecido
Obs: como tudo isto é trabalhoso, pode-se dizer que o programa não apresentará erros do tipo dos citados acima DESDE QUE você o saiba usar e use-o corretamente. Nada de digitar letras e valores negativos e outras coisas nos lugares dos parâmetros. Então você poderá dormir sossegada com esta.
Agora, o problema sobre prá que serve o programa: não vou pesquisar, mas se não me engano, números ambos amigos possuem um a soma de divisores do outro.
E números perfeitos possuem a própria soma de divisores como seu próprio valor vezes dois. Veja se não há erro de lógica.
Agora segue o programa tabulado:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int somaDivisores( int valor )
{
int extra = (int) sqrt( valor ), j, divid, soma = 0;
for( j = 1; j <= extra; j++ )
{
if( valor % j == 0 )
{
divid = valor / j;
if( ( valor / j ) == j )
divid = 0;
soma += j + divid;
}
}
return soma;
}
int main( int argc, char **argv )
{
double fracaoA;
int minimo = atoi( argv[1] );
int maximo = atoi( argv[2] );
int range = maximo - minimo;
double amigos[ range ];
int i,j;
for( j = minimo; j <= maximo; j++ )
{
fracaoA = (double) somaDivisores( j ) / j;
amigos[ j - minimo ] = fracaoA;
}
for( i = 0; i <= range; i++ )
{
for( j = i + 1; j <= range; j++ )
{
if( amigos[ i ] == amigos[ j ] )
{
printf( "Os numeros %d e %d são mutuamente amigos.\n",
( minimo + j ), ( minimo + i ) );
}
}
}
return 0;
}
----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)
Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden