Erro na hora de varrer uma STRING

7 respostas
hectorhansen

Ola!

Gostaria de saber o motivo que meu programa esta dando um erro na hora de compilar, o programa tem que varrer a String N procurando a outra String D, tudo ocorre bem se eu nao colocar uma String muito grande.(acima de 10 caracteres já erro).

package main;

import java.util.Scanner;

public class maratona {

    public static void main(String[] args) {
        int d,n;
        
        Scanner input = new Scanner(System.in);
        
        //Atribuindo valor a tecla com defeito.
        d=input.nextInt();
        
        //Colocando as restrições.(1 ≤ D ≤ 9)
        if (d<1||d>9){
            System.exit(0);
        }
        
        //Atribuindo valor para ser comparado.
        n=input.nextInt();
        
        //Colocando as restrições (1 ≤ N < 10^100)
        if (n<1||n>Math.pow(10,100)){
            System.exit(0);
        }
        
        //Se for digitado 0 0 sair do programa.
        if(d==0 && n==0){
            System.exit(0);
        }
        
        //Conversão de INT>STRING
        String D = new Integer(d).toString();
        String N = new Integer(n).toString();
        
        //Substituindo a "tecla" quebrada por "".
        N = N.replaceAll(D,"");
        
        //Se não houver mais nenhuma letra sair do programa.
        if(N.length()<1){
            System.out.print("0");
            System.exit(0);
        }
        //Convertendo STRING>INT, Para mostrar apenas um 0 se o resultado for
        //mais de um 0.
        n = Integer.parseInt(N);
        
        //Exibindo Resposta.
        System.out.print(n);
                
    }
}
ERRO: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!:
//teste 7
//teste [telefone removido]
 Exception in thread "main" java.util.InputMismatchException: For input string: "[telefone removido]"
	at java.util.Scanner.nextInt(Scanner.java:2166)
	at java.util.Scanner.nextInt(Scanner.java:2119)
	at main.maratona.main(maratona.java:22)
Java Result: 1

7 Respostas

ribclauport

Na linha treze você esta usando um método que está lançando a exceção pelo seguinte motivo:

Um int tem o seguinte range -2,147,483,648 to 2,147,483,647 ou seja (-2^31) até (2^31 -1), quando o método encontra sua String, ele verifica que o valor
não pode ser “match”(combinar) em um int, ou seja qualquer coisa fora desse range vai dar erro.

hectorhansen

E como eu faria?.. ja tentei de tudo aqui mais nada…
sempre da erro se o numero a ser varrido é muito grande.

ViniGodoy

Troque de Integer para Long.

hectorhansen

Vini, Troquei para Long .. mais nada mudou!

ainda da erro de complilação.

public static void main(String[] args) {
        long d,n;
        
        Scanner input = new Scanner(System.in);
        
        //Atribuindo valor a tecla com defeito.
        d=input.nextLong();
        
        //Colocando as restrições.(1 ≤ D ≤ 9)
        if (d<1||d>9){
            System.exit(0);
        }
        
        //Atribuindo valor para ser comparado.
        n=input.nextLong();
        
        //Colocando as restrições (1 ≤ N < 10^100)
        if (n<1||n>Math.pow(10,100)){
            System.exit(0);
        }
        
        //Se for digitado 0 0 sair do programa.
        if(d==0 && n==0){
            System.exit(0);
        }
        
        //Conversão de INT>STRING
        String D = new Long(d).toString();
        String N = new Long(n).toString();
        
        //Substituindo a "tecla" quebrada por "".
        N = N.replaceAll(D,"");
        
        //Se não houver mais nenhuma letra sair do programa.
        if(N.length()<1){
            System.out.print("0");
            System.exit(0);
        }
        //Convertendo STRING>INT, Para mostrar apenas um 0 se o resultado for
        //mais de um 0.
        n = Integer.parseInt(N);
        
        //Exibindo Resposta.
        System.out.print(n);
                
    }
}
yhhik

colega seu algoritmo ta funcionando perfeitamente…porém cada tipo primitivo tem um tamanho…
o int aceita 4 bytes o long 8 bytes…
ou seja se vc fazer isso na calculadora, vc verá que qualquer coisa que seja maior que 9.223.372.036.854.775.807 dará erro.
se vc quer evitar esse tipo de problema trabalhe diretamente com String.

faça o teste vc msm…
coloque 1111111111111111111 são 19 números, isso vai passar pq está dentro do to espaço do long.
coloque 11111111111111111111 são 20 números, ae já vai gerar uma exceção pq ultrapassou o espaço reservado.

hectorhansen

Obrigado, Trabalhei com a String que o yhhik falou… e deu tudo certo.

Obrigado a todos. :lol:

ViniGodoy

Outra possibilidade é usar o BigDecimal, ou BigInteger.

Criado 19 de fevereiro de 2012
Ultima resposta 19 de fev. de 2012
Respostas 7
Participantes 4