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