Tenho que fazer um programa que execute as seguintes ações:
[i]Chamamos números mágicos relativos a um inteiro N > 0 qualquer par de números inteiros positivos, n1 e n2, tais que nenhum deles tenha qualquer dígito repetido e n1/n2 seja igual ao inteiro N.
Descrição:
Faça um programa que leia do teclado um número inteiro N. Após a leitura de N, seu programa deve imprimir todos os números mágicos relativos a N. Isto é, seu programa deve imprimir, no formato indicado no exemplo abaixo, todos os pares de números inteiros positivos n1 e n2 tais que n1/n2 = N.
Ao final, seu programa deve imprimir a mensagem:
Gerou XXX pares de números.
Onde XXX corresponde à quantidade de pares de números mágicos impressos pelo programa.
Se o usuário digitar um número para o qual não há números mágicos, seu programa deve imprimir a mensagem:
Não há números mágicos.
Após imprimir os números mágicos relativos a um número N e/ou a mensagem final correspondente, seu programa deve reiniciar o procedimento, voltando a ler um novo número do teclado.
Quando o usuário digitar o número 0 (zero), seu programa deve parar, imprimindo a mensagem:
Fim de programa.
Assunções e restrições:
(1) Seu programa pode imprimir uma mensagem inicial solicitando a digitação de um número inteiro.
(2) O usuário sempre irá digitar um número inteiro. Não é necessário tratar erros de formato.
(3) Assuma que o usuário pode digitar um inteiro longo.
(4) Os pares de números mágicos n1 / n2 devem ser impressos sempre com o maior número à esquerda, como mostrado no exemplo abaixo.
(5) Não deve haver linha em branco entre as mensagens relativas a um mesmo procedimento (um mesmo número lido). Deve haver uma linha em branco entre um procedimento e outro.
Exemplos:
A saída abaixo ilustra uma possível execução do programa, em que são digitados quatro números:
Digite um número inteiro: 1234567890
1234567890 / 1 = 1234567890
2469135780 / 2 = 1234567890
4938271560 / 4 = 1234567890
6172839450 / 5 = 1234567890
8641975230 / 7 = 1234567890
9876543120 / 8 = 1234567890
Gerou 6 pares de números.
Digite um número inteiro: -56744
Não há números mágicos.
Digite um número inteiro: 10345678
10345678 / 1 = 10345678
51728390 / 5 = 10345678
951802376 / 92 = 10345678
Gerou 3 pares de números.
Digite um número inteiro: 0
Fim de programa.[/i]
Porém estou tendo dificuldades para estruturar uma condição que leia e verifique se todos os dígitos do numerador e do numerador da fração que sempre resultará no número mágico são realmente diferentes ou não, e aplique o resultado da verificação aos cálculos.
Observação: O meu código-fonte até agora é o seguinte:
[code]import java.util.;
class M090031911v4 {
static long b, c, l;
static long k = 0;
public static void main(String[] args) {
Scanner ler = new Scanner(System.in);
boolean repeat = true;
do {
System.out.println("Digite um número inteiro positivo: ");
long a = ler.nextLong();
double d = Math.pow(10, 10);
do {
k = k + 1;
b = ak; //numerador.
c = k; //denominador.
if (repete(b)==false && repete©==false) {
System.out.println(b+" / “+c+” = "+a);
l = k;
}
} while ((b<d));
l = k;
System.out.println(“Foram gerados “+l+” números mágicos referentes ao número digitado.”);
} while ((repeat == true)); //repetir a execução do programa.
}
static boolean repete(long n) {
String ns = Long.toString(n);
boolean resultf = true;
int i = 0;
do {
i = i + 1;
if (ns.charAt(ns.length() -1) == ns.charAt(i))
resultf = true;
else
resultf = false;
return resultf;
} while ((i < ns.length()));
}
}[/code]
Porém, quando eu tento digitar o exemplo 1234567890, a execução do programa apresenta o seguinte erro:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.charAt(String.java:694)
at M090031911v4.repete(M090031911v4.java:32)
at M090031911v4.main(M090031911v4.java:16)
E quando eu tento digitar outros valores diferentes dos exemplos, muitos resultados exibidos não estão corretos (apresentam repetições de dígitos no numerador e/ou denominador).
Sugestões para solucionar isso? É uma tarefa escolar, portanto não posso utilizar métodos e operadores muito avançados, devo respeitar a estrutura conforme esta que eu lhes apresentei.
Grato.
Ontem eu tinha falado ( http://www.guj.com.br/posts/list/126419.java#683149 ) como é que você pode checar se em um número os dígitos são repetidos. Como você não entendeu, vou pôr uma implementação (com um teste) aqui.
class TesteDigitosRepetidos {
public static boolean ehRepetido (long n) {
// Se digitos[i] == true então o dígito já foi encontrado
// na representação decimal de n.
// Estamos supondo aqui que n seja positivo, para facilitar.
boolean[] digitos = new boolean [10]; // o Java inicializa tudo com false
String s = Long.toString (n);
for (int i = 0; i < s.length(); ++i) {
int d = s.charAt (i) - '0';
if (digitos [d])
return false;
digitos[d] = true;
}
return true;
}
public static void main(String[] args) {
System.out.println (ehRepetido (11L));
System.out.println (ehRepetido (1234567890L));
System.out.println (ehRepetido (1234567891L));
System.out.println (ehRepetido (9991928838L));
System.out.println (ehRepetido (4938271560L));
System.out.println (ehRepetido (6172839450L));
System.out.println (ehRepetido (8641975230L));
System.out.println (ehRepetido (9876543120L));
}
}