Ver Mensaje Individual
  #3  
Antiguo 19-04-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 11
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(TComponentOwner)
   : 
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<=valor.Length(); i++)
      {
         if(
valorLimite[i] > valor[i]){
            break;
         }else if (
valorLimite [i] < valor[i]){
            
overflow=true;
            break;
         }
      }
   }else if(
valorLimite.Length() > valor.Length()){
      
overflowfalse;
   }else{
      
overflow=true;
   }
   return 
overflow;
}
//---------------------------------------------------------------------------

bool dividirHex(AnsiString dividendoAnsiString divisorAnsiString *cocienteAnsiString *resto)
{
   
unsigned __int64 auxDividendoauxDivisorauxCociente=0auxResto=0;
   
bool salir=false;
   
bool retval=false;
   
int largoDividendolargoDivisorlargoPorcionpos=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 && auxCociente 0)
                  
dividendoAnsiString().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(DividendoDivisor, &Cociente, &Resto);
   
EditCociente->Text Cociente;
   
EditResto->Text Resto;
}
//--------------------------------------------------------------------------- 
Responder Con Cita