Advertisement
DavidsonDFGL

BigBig - [em DESENVOLVIMENTO]

Jan 11th, 2014
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.67 KB | None | 0 0
  1. /**
  2. * BigBig - operacao de numeros gigantes com precisao arbitraria
  3. * @author Davidson Francis
  4. * @since 15/08/2013
  5. * @version v.1.0
  6. */
  7.  
  8. public class BigBig
  9. {
  10.     private StringBuilder result;
  11.     private int carry;
  12.    
  13.     BigBig()
  14.     {
  15.         result = null;
  16.         carry  = 0;
  17.     }
  18.    
  19.     /**
  20.     * <b>Metodo add</b>, realiza adicao de 2 numeros inteiros.
  21.     * @param n1 String do numero 1
  22.     * @param n2 String do numero 2
  23.     */
  24.     public void add(String n1, String n2)
  25.     {
  26.         this.result = new StringBuilder("");
  27.         this.carry  = 0;
  28.         int tamanho = 0;
  29.         char sinal = ' ';
  30.            
  31.         if( (getSignal(n1) == '+' && getSignal(n2) == '+') || (getSignal(n1) == '-' && getSignal(n2) == '-') )
  32.         {
  33.             if(getSignal(n1) == '-' && getSignal(n2) == '-')
  34.             {
  35.                 sinal = '-';
  36.             }
  37.         }
  38.         else
  39.         {
  40.             if( (getSignal(n1) == '+' && getSignal(n2) == '-') || (getSignal(n1) == '-' && getSignal(n2) == '+') )
  41.             {
  42.                 //Ajuste do sinal antes de chamar a subtracao
  43.                 if(getSignal(n2) == '-')
  44.                 {
  45.                     n2 = "+"+n2.substring(1,n2.length());
  46.                 }
  47.                 else
  48.                 {
  49.                     if(getSignal(n2) == '+')
  50.                     {
  51.                         if(n2.charAt(0) == '+')
  52.                         {
  53.                             n2 = "-"+n2.substring(1,n2.length());
  54.                         }
  55.                         else
  56.                         {
  57.                             n2 = "-"+n2;
  58.                         }
  59.                     }
  60.                 }
  61.                 sub(n1,n2);
  62.                 return ;
  63.             }
  64.         }
  65.        
  66.         n1 = formatNumber(n1);
  67.         n2 = formatNumber(n2);
  68.        
  69.         //Igualar o tamanho dos operandos
  70.         if(n1.length() > n2.length())
  71.         {
  72.             tamanho = n1.length();
  73.             StringBuilder tmp = new StringBuilder("");
  74.            
  75.             for(int x=n1.length()-n2.length(); x>0; x--) tmp.append("0");
  76.            
  77.             tmp.append(n2);
  78.             n2 = ""+tmp;
  79.         }
  80.         else
  81.         {
  82.             if(n2.length() > n1.length())
  83.             {
  84.                 tamanho = n2.length();
  85.                 StringBuilder tmp = new StringBuilder("");
  86.                
  87.                 for(int x=n2.length()-n1.length(); x>0; x--) tmp.append("0");
  88.                
  89.                 tmp.append(n1);
  90.                 n1 = ""+tmp;
  91.             }
  92.             else
  93.             {
  94.                 tamanho = n1.length();
  95.             }
  96.         }
  97.        
  98.         //Soma propriamente dita
  99.         for(int x=tamanho-1; x>=0; x--)
  100.         {
  101.             this.result.append( (char)(( ( (((int)(((char)n1.charAt(x))))-48) + (((int)(((char)n2.charAt(x))))-48) + this.carry ) % 10)+48) );
  102.             this.carry = (int)(( (((int)(((char)n1.charAt(x))))-48) + (((int)(((char)n2.charAt(x))))-48)      + this.carry ) / 10);
  103.         }
  104.  
  105.         if(this.carry != 0) result.append((char)(this.carry+48));
  106.         if(sinal == '-') result.append('-');
  107.     }
  108.  
  109.     /**
  110.     * <b>Metodo sub</b>, realiza subtracao de 2 numeros inteiros por meio de complemento de 2.
  111.     * @param n1 String do numero 1
  112.     * @param n2 String do numero 2
  113.     */
  114.     public void sub(String n1, String n2)
  115.     {
  116.         this.result = new StringBuilder("");
  117.         StringBuilder numc2 = new StringBuilder("");
  118.         short maior = 0;
  119.         char sinal = ' ';
  120.        
  121.         //Aritmetica de sinais, XD
  122.         if(getSignal(n2) == '-')
  123.         {
  124.             n2 = "+"+n2.substring(1,n2.length());
  125.         }
  126.         else
  127.         {
  128.             if(getSignal(n2) == '+')
  129.             {
  130.                 if(n2.charAt(0) == '+')
  131.                 {
  132.                     n2 = "-"+n2.substring(1,n2.length());
  133.                 }
  134.                 else
  135.                 {
  136.                     n2 = "-"+n2;
  137.                 }
  138.             }
  139.         }
  140.                
  141.         if( (getSignal(n1) == '+' && getSignal(n2) == '+') || (getSignal(n1) == '-' && getSignal(n2) == '-')  )
  142.         {
  143.             add(n1,n2);
  144.             return ;
  145.         }
  146.         else
  147.         {
  148.             maior = getMaior(formatNumber(n1),formatNumber(n2));
  149.             if(maior == 1 || maior == 2)
  150.             {
  151.                 if(maior == 1 && n1.charAt(0) == '-' )
  152.                 {
  153.                     sinal = '-';
  154.                 }
  155.                 else
  156.                 {
  157.                     if(maior == 2 && n2.charAt(0) == '-' )
  158.                     {
  159.                         sinal = '-';
  160.                     }
  161.                 }
  162.             }
  163.         }
  164.        
  165.         n1 = formatNumber(n1);
  166.         n2 = formatNumber(n2);
  167.        
  168.         //Igualar tamanhos
  169.         if(n1.length() != n2.length())
  170.         {
  171.             if(n1.length() < n2.length())
  172.             {
  173.                 StringBuilder tmp = new StringBuilder("");
  174.                 for(int x=n2.length()-n1.length(); x>0; x--) tmp.append("0");
  175.                 tmp.append(n1);
  176.                 n1 = ""+tmp;
  177.             }
  178.             else
  179.             {
  180.                 StringBuilder tmp = new StringBuilder("");
  181.                 for(int x=n1.length()-n2.length(); x>0; x--) tmp.append("0");
  182.                 tmp.append(n2);
  183.                 n2 = ""+tmp;
  184.             }
  185.         }  
  186.        
  187.         //Calcula complemento de 2
  188.         if(maior == 0 || maior == 1)
  189.         {
  190.             for(int x=n2.length()-1; x>=0; x--)
  191.             {
  192.                 numc2.append( (char)((9-((int)(n2.charAt(x))-48))+48) );
  193.             }
  194.             add(""+numc2.reverse(),"1");
  195.             numc2 = this.result.reverse();
  196.         }  
  197.         else
  198.         {
  199.             for(int x=n1.length()-1; x>=0; x--)
  200.             {
  201.                 numc2.append( (char)((9-((int)(n1.charAt(x))-48))+48) );
  202.             }
  203.             add(""+numc2.reverse(),"1");
  204.             numc2 = this.result.reverse();
  205.         }
  206.        
  207.         //Realiza a soma, e remove a unidade extra, o "overflow"
  208.         if(maior != 2)
  209.         {
  210.             add(n1,""+numc2);
  211.         }
  212.         else
  213.         {
  214.             add(n2,""+numc2);
  215.         }
  216.         this.result = this.result.deleteCharAt(this.result.length()-1);
  217.         if(sinal == '-') this.result.append('-');
  218.     }
  219.    
  220.     /**
  221.     * <b>Funcao getMaior</b>, compara dois numeros e retorna o maior dentre eles.
  222.     * @param n1,n2 numeros a serem comparados entre si
  223.     * @return - 1 se o maior numero for o 1<br>- 2 se o segundo <br>- 0 se iguais
  224.     */
  225.     public short getMaior(String n1, String n2)
  226.     {
  227.         short maior = 0;
  228.        
  229.         //Numeros de sinais positivos
  230.         if( (n1.charAt(0) == '+' && n2.charAt(0) == '+') || (n1.charAt(0) >= '0' && n1.charAt(0) <= '9' && n2.charAt(0) >= '0' && n2.charAt(0) <= '9') )
  231.         {
  232.             if(n1.length() == n2.length())
  233.             {
  234.                 for(int x=0; x<n1.length(); x++)
  235.                 {
  236.                     if(n1.charAt(x) > n2.charAt(x))
  237.                     {
  238.                         maior = 1;
  239.                         x=n1.length();
  240.                     }
  241.                     else if(n2.charAt(x) > n1.charAt(x))
  242.                     {
  243.                         maior = 2;
  244.                         x=n1.length();
  245.                     }
  246.                 }
  247.             }
  248.             else
  249.             {
  250.                 maior = (n1.length() > n2.length()) ? (short)1 : (short)2;
  251.             }
  252.         }
  253.         //Numeros que possuem sinais negativos
  254.         else
  255.         {
  256.             if( (n1.charAt(0) == '-' && n2.charAt(0) == '-') )
  257.             {
  258.                 if(n1.length() == n2.length())
  259.                 {
  260.                     for(int x=0; x<n1.length(); x++)
  261.                     {
  262.                         if(n1.charAt(x) < n2.charAt(x))
  263.                         {
  264.                             maior = 1;
  265.                             x=n1.length();
  266.                         }
  267.                         else if(n2.charAt(x) < n1.charAt(x))
  268.                         {
  269.                             maior = 2;
  270.                             x=n1.length();
  271.                         }
  272.                     }
  273.                 }
  274.                 else
  275.                 {
  276.                     maior = (n1.length() < n2.length()) ? (short)1 : (short)2;
  277.                 }
  278.             }
  279.             //Numeros que possuem sinais positivos e negativos
  280.             else
  281.             {
  282.                 if(n1.charAt(0) == '-')
  283.                 {
  284.                     maior = 2;
  285.                 }
  286.                 else
  287.                 {
  288.                     maior = 1;
  289.                 }
  290.             }      
  291.         }
  292.         return maior;
  293.     }
  294.    
  295.     /**
  296.     * <b>Funcao formatNumber</b>, formata o numero de entrada para o formato esperado<br>nas funcoes <i>add,sub...</i>
  297.     * @param n1 String do numero a ser formatado
  298.     * @return numero formatado menos o sinal
  299.     */
  300.     private String formatNumber(String n1)
  301.     {
  302.         String retorno = n1;
  303.        
  304.         if( !(n1.charAt(0) >= '0' && n1.charAt(0) <= '9') )
  305.         {
  306.             retorno = n1.substring(1,n1.length());
  307.         }
  308.         return retorno;
  309.     }
  310.    
  311.     /**
  312.     * <b>Funcao getSignal</b>, obtem o sinal do numero passado como parametro e o devolve como char.
  313.     * @param n1 String do numero a obter o sinal.
  314.     * @return caractere de sinal do numero
  315.     */
  316.     private char getSignal(String n1)
  317.     {
  318.         char retorno = ' ';
  319.    
  320.         if(n1.charAt(0) == '+' || n1.charAt(0) == '-')
  321.         {
  322.             retorno = n1.charAt(0);
  323.         }
  324.         else
  325.         {
  326.             retorno = '+';
  327.         }
  328.         return retorno;
  329.     }
  330.    
  331.     /**
  332.     * <b>Funcao hasSignal</b>, retorna valor booleano correspondente ao sinal dado como parametro.
  333.     * @param n1 String do numero a ser verificado
  334.     * @return - true, se o numero possui um sinal (seja + ou -)<br>- false, se o numero nao possui caractere de sinal
  335.     */
  336.     private boolean hasSignal(String n1)
  337.     {
  338.         return (n1.charAt(0) == '+' || n1.charAt(0) == '-') ? true : false;
  339.     }
  340.    
  341.     /**
  342.     * <b>Funcao toString</b>, obtem o resultado no formato String de uma operacao realizada.
  343.     * @return retorna em String o valor da operacao realizada (add,sub...)
  344.     */
  345.     public String toString()
  346.     {
  347.         if(this.result != null)
  348.         {
  349.             return ""+this.result.reverse();
  350.         }
  351.         else
  352.         {
  353.             return "0";
  354.         }
  355.     }
  356. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement