Problema com Lógica

4 respostas
A

Bom eu tentei usar mais ou menos a logica da soma para tentar fazer a subtração…quando o numero da classe é maior que o numero que vem de fora para fazer a subtração ela faiz certo o problema está quado o numero é do mesmo tamanho ou então maior do que o que está na classe

segue abaixo só o codigo do método que eu estou com problemas e logo após todo o código do programa.

public BigInt sub(int valor){
		
		BigInt bigInt = new BigInt(valor);
		
		//Se a quantidade de algarismos do número a ser adicionado for menor do que a que temos na classe
		if(bigInt.number.length < number.length){
			
			int aux = 0; 
			
			for(int i=0; i<bigInt.number.length; i++){
				if(number[i] < bigInt.number[i]){
					number[i+1]--;
					aux = 10;
				}else{
					aux = 0;
				}
				int sub = (number[i] + aux) - bigInt.number[i];
				//aux = sub/10 * 10;
				number[i] = sub % 10;
			}				
		}else{
			positive = false;
			int aux = 0; 
			
			for(int i=0; i<number.length; i++){
				if(number[i] < bigInt.number[i] ){
					bigInt.number[i+1]--;
					aux = 10;
				}else{
					aux = 0;
				}
				int sub = (bigInt.number[i] + aux) - number[i];
				//aux = sub * 10;
				bigInt.number[i] = sub % 10;
			}
			
			if(bigInt.number.length > number.length){
				System.out.println("Aki");
				if(aux == 10)
					aux = 1;
				if(bigInt.number[number.length]!= 0)
				bigInt.number[number.length] = bigInt.number[number.length] - aux;
			}
			else 
				if(aux != 0){
				positive = true;
				int numberAux[] = new int[bigInt.number.length + 1];
				
				for(int i=0; i<numberAux.length-1; i++){
					numberAux[i] = bigInt.number[i];
				}
				
				//numberAux[numberAux.length-1] = aux;
				//bigInt.number = numberAux;
			}
			
			number = bigInt.number;
			System.out.println(number[1]);
			System.out.println(bigInt.number[1]);
		}
		
		return this;
	}

Código Completo

public class BigInt {
	
	
	protected int number[];
	protected boolean positive;
	
	
	public BigInt(long value){
		positive = value >= 0;
		long n = (long)Math.abs(value); //SE O Nº FOR NEGATIVO ELE VIRA POSITIVO, SE POSITIVO
										// ELE CONTINUA POSITIVO
		int digits = ("" + value).length() +1; //PEGA O TAMANHO DE VALUE, QUE É TO TAMNHO DOS NUMEROS DIGITADOS
		number = new int[digits];
		
		for(int i = 0; i<digits; i++){
			number[i] = (int)(n%10); // RECEBE O RESTO DA DIVISÃO OU SEJA NO CASO O ULTIMO NUMERO JÁ
									// QUE ELE ESTÁ SENDO DIVIDIDO POR 10
			n = n/10; // RETIRA O ULTIMO NUMERO DE n JÁ QUE ELE ESTÁ SENDO DIVIDIDO POR 10
		}
	}
	
	public BigInt(){
		this(0);
	}
	
	
	public BigInt(String value){
		
		String n;
		positive = value.charAt(0) != '-';
		
		if(value.charAt(0) == '+' || value.charAt(0) == '-'){
			n = value.substring(1); // SE NA 1ª POSIÇÃO DA STRING ESTIVER O SINAL '+' OU '-'
									// ELE RETIRA E COPIA O RESTO, POR ISSO SUBSTRING(1);, COPIA APARTIR DA POS. 1
		}else{
			n = value;
		}
		
		int digits = n.length();
		number = new int[digits];
		
		for(int i=0; i<digits; i++){
			number[digits-1-i] = n.charAt(i)-48;
			/* NA TABELA ASCII O NUMERO 0(ZERO) É O 48, COMO ESTAMOS PEGANDO UM CHAR ELE BUSCARÁ NA TABELA ASCII O Nº CORRESPONDENTE SE
			 * FIZERMOS -48, SE FOR 1 SERIA O Nº 49 NA TABELA SE FIZERMOS -48 ELE VOLTA A VALER 1 NOVAMENTE
			 */
		}
	}
	
	public String toString(){
		
		StringBuffer sb = new StringBuffer();
		sb.append(positive ? '+' : '-');
		/*O 'append' SERVE PARA PEGAR QUALQUER VALOR, NÃO IMPORTA E É CHAR, INT, DOUBLE
		 * ELE COLOCA NA VARIAVEL 'sb'
		 * COMO 'positive' É BOOLEAN O TESTE PARA ELE É "? '+' (OU): '-'
		 */
		for(int i=number.length-1; i>=0; i--){
			sb.append(number[i]); 
			/* AQUI O append COLOCARA CADA POSIÇÃO DE NUMBER[I] EM sb
			 * EX:
			 *  NUMBER = 123456789
			 *  sb VAI SER sb=987654321
			 *  DO MENOS SIGNIFICATIVO PARA O MAIS SIGNIFICATIVO
			 *  PQ PARA NUMEROS NOS LEMOS DA DIREITA PARA A ESQUERDA MAS EM FRASES LEMOS DA ESQUERDA PARA A DIREITA
			 */
		}
		return sb.toString();
	}
	
	public BigInt(BigInt value){
		
		positive = value.positive; //RECEBE O VALOR DA VARIAVEL POSITIVE DO OUTRO CONSTRUTOR
		number = new int [value.number.length]; // NUMBER RECEBE O TAMNHO DE VALUE DO OUTRO CONSTRUTOR
		
		for(int i =0; i<number.length; i++){
			number[i] = value.number[i]; // number RECEBE O VALOR DA POSIÇÃO 'i' DE number DO OUTRO CONSTRUTOR
		}
	}
	
	public BigInt add(int valor){
		
		BigInt bigInt = new BigInt(valor);
		
		//Se a quantidade de algarismos do número a ser adicionado for menor do que a que temos na classe
		if(bigInt.number.length < number.length){
			
			int aux = 0; //será utilizado para somar os números que "sobem" para a proxima casa. Ex: 9 + 9 = 18 ---> o aux receberá o 1 do 18.
			
			for(int i=0; i<bigInt.number.length; i++){
				
				int soma = number[i] + bigInt.number[i] + aux;
				aux = soma / 10;
				number[i] = soma % 10;
			}
			
			number[bigInt.number.length] = number[bigInt.number.length] + aux;
		}
		else{
			
			int aux = 0; //será utilizado para somar os números que "sobem" para a proxima casa. Ex: 9 + 9 = 18 ---> o aux receberá o 1 do 18.
			
			for(int i=0; i<number.length; i++){
				
				int soma = number[i] + bigInt.number[i] + aux;
				aux = soma / 10;
				bigInt.number[i] = soma % 10;
			}
			
			if(bigInt.number.length > number.length){
				bigInt.number[number.length] = bigInt.number[number.length] + aux;
			}
			else if(aux != 0){
				int numberAux[] = new int[bigInt.number.length + 1];
				
				for(int i=0; i<numberAux.length-1; i++){
					numberAux[i] = bigInt.number[i];
				}
				
				numberAux[numberAux.length-1] = aux;
				bigInt.number = numberAux;
			}
			
			number = bigInt.number;
		}
		
		return this;
	}
	
	/*
	 * BigInt bigInt = new BigInt(valor);
		
			if(bigInt.number.length < number.length){
			
			int aux = 0; //será utilizado para somar os números que "sobem" para a proxima casa. Ex: 9 + 9 = 18 ---> o aux receberá o 1 do 18.
			
			for(int i=0; i<bigInt.number.length; i++){
				if(number[i] < bigInt.number[i]){
					number[i+1]--;
					aux = 10;					
				}
				int sub = (number[i] + aux) - bigInt.number[i];
				aux = sub * 10;
				number[i] = sub % 10;
			}				
		}else{
	 */
	
public BigInt sub(int valor){
		
		BigInt bigInt = new BigInt(valor);
		
		//Se a quantidade de algarismos do número a ser adicionado for menor do que a que temos na classe
		if(bigInt.number.length < number.length){
			
			int aux = 0; //será utilizado para somar os números que "sobem" para a proxima casa. Ex: 9 + 9 = 18 ---> o aux receberá o 1 do 18.
			
			for(int i=0; i<bigInt.number.length; i++){
				if(number[i] < bigInt.number[i]){
					number[i+1]--;
					aux = 10;
				}else{
					aux = 0;
				}
				int sub = (number[i] + aux) - bigInt.number[i];
				//aux = sub/10 * 10;
				number[i] = sub % 10;
			}				
		}else{
			positive = false;
			int aux = 0; 
			
			for(int i=0; i<number.length; i++){
				if(number[i] < bigInt.number[i] ){
					bigInt.number[i+1]--;
					aux = 10;
				}else{
					aux = 0;
				}
				int sub = (bigInt.number[i] + aux) - number[i];
				//aux = sub * 10;
				bigInt.number[i] = sub % 10;
			}
			
			if(bigInt.number.length > number.length){
				System.out.println("Aki");
				if(aux == 10)
					aux = 1;
				if(bigInt.number[number.length]!= 0)
				bigInt.number[number.length] = bigInt.number[number.length] - aux;
			}
			else 
				if(aux != 0){
				positive = true;
				int numberAux[] = new int[bigInt.number.length + 1];
				
				for(int i=0; i<numberAux.length-1; i++){
					numberAux[i] = bigInt.number[i];
				}
				
				//numberAux[numberAux.length-1] = aux;
				//bigInt.number = numberAux;
			}
			
			number = bigInt.number;
			System.out.println(number[1]);
			System.out.println(bigInt.number[1]);
		}
		
		return this;
	}
	
}

se alguem puder ajudar…
agradeço

4 Respostas

Roger75

Ficaria mais fácil de entender se você explicasse o que você quer que a classe faça, e também com exemplos de dados de entrada e as saídas que quer que ocorram.

A

eh tanta coisa pra faze da facul que a pressa atrapalha

bom vamos lá…
está sub deverá fazer a subtração entre dois numeros
entre number[] que está contido na class BigInt e um valor int que será passado ao metodo
se o valor de int for 10 e o de number[] 100
o resultado será 90.

CrazyFrogJava

Esse seu 100 no exemplo que você deu ele será um valor estático?

A
não foi soh um exemplo.

bom vamos lahesse number[] será criado quando fizermos BigInt bg = new BigInt (100);

number[0] =1

number[1] = 0

number[2] = 0

dai qdo eu chamo o metodo bg.sub(10) ele cria um novo BigInt bigInt e seu number vale 10

ele deveria realizar a subtração destes dois numerosno caso em que o number da classe é maior que o number que foi  passado ao metodo a subtração ocorre corretamente

o problema se encontra quado o numero de number da classe é o mesmo do number passado pelo metodo tipo (number da classe 100 number de metodo 999)

ou entçao quando o number do metodo é maior que o que jah se encontra na classe

não sei se fui muito claro espero que sim…qlquer coisa perguntem e obrigado desde já.

Criado 16 de junho de 2009
Ultima resposta 16 de jun. de 2009
Respostas 4
Participantes 3