Galera, preciso fazer um programa em java com as seguintes especificações:
Tenho que fazer um programa que execute as seguintes ações:
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: [telefone removido]
[telefone removido] / 1 = [telefone removido]
[telefone removido] / 2 = [telefone removido]
[telefone removido] / 4 = [telefone removido]
[telefone removido] / 5 = [telefone removido]
[telefone removido] / 7 = [telefone removido]
[telefone removido] / 8 = [telefone removido]
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.
Meu programa fica "preso" durante a varredura das strings sn1 e sn2.
Alguém tem alguma sugestão?
import java.util.*;
public class Magicos {
public static void main(String[] args){
Scanner tec = new Scanner(System.in);
long N, n1, n2, cont;
String sn1, sn2;
int i,j,k,l,fim,tamanho;
fim = 0;
cont = 0;
N = 1;
n2 = 1;
long MAX = 987654321; // maior numero possivel sem algarismos repetidos
while(N != 0)
{
System.out.println("Digite um numero inteiro: ");
N = tec.nextLong();
n1 = n2*N;
if(N==0)
{
break;
}
else
{
sn1 = Long.toString(n1);
sn2 = Long.toString(n2);
tamanho = sn2.length();
// varredura das strings
while (fim == 0){
// String de n2
for(k=0; k< sn2.length();k++){
for(l=k+1; l<sn2.length();l++){
if (sn2.charAt(k)== sn2.charAt(l)){fim = 1;
break;
}}
}
// String de n1
for(i=0; i>< sn1.length();i++){
for(j=i+1; j<sn1.length();j++){
if (sn1.charAt(i)== sn1.charAt(j)){fim =1;
break;
}
}
}
// Impressão na tela
if(fim == 1)
{
if(n1 > n2){
System.out.println(n1+" / "+n2+" = "+N);
cont++;
}
else{
System.out.println(n1+" / "+n2+" = "+N);
cont++;
}
}
}
}
// Fim da varredura das Strings
if (cont>0){ System.out.println("Foram encontrados "+cont+" pares de numeros");}
n2++;
if(n2*N >= MAX){fim = 1;}
}
System.out.println("Fim do Programa!");
}
}