Ver Mensaje Individual
  #3  
Antiguo 19-04-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
aguml Va por buen camino
Bueno lo hice de otra manera despues de estar toda la tarde liado pero no doy con la tecla y no me sale y se convierte en un bucle infinito. Pongo lo que tengo para ver si podeis ayudarme a dejarlo bien:

Código PHP:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <limits>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------


bool IsOverflow (AnsiString valor)
{
   
bool overflow=false;
   
AnsiString valorLimite = std::numeric_limits<unsigned long long>::max();

   if(
valorLimite.Length() == valor.Length()){
      for (
int i=1; i <=valor.Length(); i++)
      {
         if(
valorLimite[i] > valor[i]){
            break;
         }else if (
valorLimite [i] < valor[i]){
            
overflow=true;
            break;
         }
      }
   }else if(
valorLimite.Length() > valor.Length()){
      
overflow= false;
   }else{
      
overflow=true;
   }
   return 
overflow;
}
//---------------------------------------------------------------------------

bool dividirHex(AnsiString dividendo, AnsiString divisor, AnsiString *cociente, AnsiString *resto)
{
   
unsigned __int64 auxDividendo, auxDivisor, auxCociente=0, auxResto=0;
   
bool salir=false;
   
bool retval=false;
   
int largoDividendo, largoDivisor, largoPorcion, pos=0;

   
largoDivisor=divisor.Length();

   if (!
IsOverflow (divisor)){
      *
cociente="";
      *
resto="";
      
auxDivisor = StrToInt64(AnsiString("0x" + divisor));

      do {
         
largoDividendo=dividendo.Length ();
         
largoPorcion=largoDivisor;

         if(
largoDividendo >= largoDivisor+pos){
            
auxDividendo = StrToInt64(AnsiString("0x" + dividendo.SubString(1,largoPorcion+pos)));
            
            if(
IsOverflow(dividendo.SubString(1,largoPorcion))){
               
salir=true;
               
retval=false;
            }else {
               
auxResto=auxDividendo % auxDivisor;
               
auxCociente=auxDividendo / auxDivisor;
               if(
auxCociente == 0){
                  
pos++;
               }else{
                  
dividendo=dividendo.SubString(largoPorcion+pos+1,largoDividendo);
                  
pos=0;
               }
               *
cociente=*cociente + AnsiString ().sprintf("%I64X", auxCociente);
               *
resto = AnsiString().sprintf("%I64X", auxResto);
               
               if (
auxResto > 0 && auxCociente > 0)
                  
dividendo= AnsiString().sprintf("%I64X", auxResto) + dividendo;
               
retval=true;
            }
         }else {
            
salir=true;
            *
cociente=*cociente + "0";
            
pos++;
            if(
dividendo != ""){
               *
resto = AnsiString().sprintf("%I64X", dividendo);
            }else{
               *
cociente=*cociente + AnsiString().sprintf("%I64X", auxCociente);
               *
resto="0";
            }
            
retval=true;
         }
      }while(!
salir);
   }
   return 
retval;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   
AnsiString Dividendo="FFAECBF",Divisor="FF",Cociente,Resto;
   
dividirHex(Dividendo, Divisor, &Cociente, &Resto);
   
EditCociente->Text = Cociente;
   
EditResto->Text = Resto;
}
//--------------------------------------------------------------------------- 
Responder Con Cita