double base representation of a number

Discussion in 'C' started by ikj, May 28, 2009.

  1. ikj

    ikj New Member

    Joined:
    May 14, 2009
    Messages:
    14
    Likes Received:
    0
    Trophy Points:
    0
    i want to print the double base representation of a number
    ie if my number is 38 i shud get 36 + 2 and for 655 i shud get 648 + 6 + 1.
    here's my code:

    Code:
     
    unsigned long bs(unsigned long a[],unsigned long d, unsigned long beg, unsigned long end, unsigned long x)
    {    
         int mid;    
         mid=(beg+end)/2;    
         if (x<a[mid])    
         {        
                  end=mid-1;        
                  bs(a,d,beg,end,x);    
         }    
         else if(x<a[mid])    
         {        
                  beg=mid+1;        
                  bs(a,d,beg,end,x);    
         }
         else if(x>a[end])
         {    cout<<a[end]<<" + ";  
               return a[end];   
         }
         else if(x==a[mid])
         {  
              cout<<"FOUND!!\n";
              return a[mid];
         } 
    }
    void alg(unsigned long a[],unsigned long d, unsigned long x)
    {
         unsigned long num;
         num=(x-bs(a,d,0,30,x));
         if (num>0)
             alg(a,d,num);
      
    }
    main()
    {
          int c,n,d;
          d=c=(unsigned long)(pow(32,2));
          unsigned long a[d],b[c],t,x,y;
          d=c=0;
          a[0]=0;
          b[0]=0;
          for(int i=0;i<32;i++)
          {
              for(int j=0;j<32;j++)
              {
                  b[c]=(unsigned long)(pow(2,i)*pow(3,j));
                  if(j==0 || ULONG_MAX/pow(3,j)>pow(2,i))
                  {
                     a[++d]=b[c++];
                    // cout<<i<<"\t"<<j<<"\t"<<a[d]<<endl;
                  }
                  else
                  {
                      break;
                  }
               }
           }
         sort(a,a+d);
         cout<<"enter element:";
         cin>>x;
         cout<<"its representation is :"<<endl;
         alg(a,d,x);
         system("PAUSE");
    }
    
    
    wat im doing in my code for alg() is im finding the element in the array using bs()
    if the elemnt i want is in the array im printing that otherwise im finding the element that is closest (from the lesser side) to it and finding the difference ie (x - closest number to x) and calling alg for the difference and so on.
    ie for 655 the closest elemnt is 648 and 655-648 is 7 , calling alg with 7 gives the closest elemnt as 6 n 7-6 is 1 n so on..
    in my bs() code im returning the elemnt or the one which is closest to it. but somehow its not printing that elemnt n neither is it returning it.


    please help...
    thanks for reading!
     
  2. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
    Try giving better titles as that helps others to see it as well. I have edited for you as of now.
     
  3. ikj

    ikj New Member

    Joined:
    May 14, 2009
    Messages:
    14
    Likes Received:
    0
    Trophy Points:
    0
    sorry bout that..
    thanks
     
  4. SaswatPadhi

    SaswatPadhi ~ Б0ЯИ Τ0 С0δЭ ~

    Joined:
    May 5, 2009
    Messages:
    1,342
    Likes Received:
    55
    Trophy Points:
    0
    Occupation:
    STUDENT !
    Location:
    Orissa, INDIA
    Home Page:
    http://www.crackingforfun.blogspot.com
    I hate to say this, but ijk, I really need to inspect your program yourself before dumping it in a forum. :mad: :mad:
    Yeah, dumping is a harsh word to use, but look at your code. What do you think you are doing ! There are so damn many many mistakes. It was really really painful to find and correct the mistakes. It would have been much easier for me to write a program for double base representation, by myself.

    ( This is not an article, but don't blame me if it's as long as an article; 'cuz I have to highlight the mistakes )


    Mistakes :

    Code:
    [FONT="Fixedsys"]unsigned long bs(unsigned long a[],[COLOR="Red"]unsigned long d,[/COLOR] unsigned [COLOR="Red"]long[/COLOR] beg, unsigned [COLOR="Red"]long[/COLOR] end, unsigned long x)
    {    [COLOR="Red"]// WHY DOES THIS FUNC ACCEPT 'd' ?? [/COLOR]
         int mid;    
         mid=(beg+end)/2;    
         if (x<a[mid])    
         {        
                  end=mid-1;        
                  bs(a,d,beg,end,x);    
         }    
         else if(x[COLOR="Red"]<[/COLOR]a[mid])    [COLOR="Red"]//same as previous case !!!!!!!!! [/COLOR]
         {        
                  beg=mid+1;        
                  bs(a,d,beg,end,x);    
         }
         else if(x>a[end])                         [COLOR="Red"]// This should be the 2nd IF-check.[/COLOR]
         {    cout<<a[end]<<" + ";  
               return a[end];   
         }
         else if(x==a[mid])                       [COLOR="Red"]// This should be the first IF-check.[/COLOR]
         {  
              cout<<"FOUND!!\n";
              return a[mid];
         } 
    }
    
    void alg(unsigned long a[],unsigned [COLOR="Red"]long[/COLOR] d, unsigned long x)
    {
         unsigned long num;
         num=(x-bs(a,[COLOR="Red"]d,[/COLOR]0,[COLOR="Red"]30,[/COLOR]x));
         if (num>0)
             alg(a,d,num);
      
    }
    
    [COLOR="Red"]int [/COLOR]main()
    {     [COLOR="Red"]// main func was missing data-type ![/COLOR]
          int c,n,d;
          [COLOR="Red"]// 32^2 does not need unsigned long, unsigned int will do, array index should be int [/COLOR]not long.
          d=c=(unsigned long)(pow(32,2));
    [COLOR="Red"]      // array b was ABSOLUTELY un-necessary ![/COLOR]
          unsigned long a[d],b[c],t,x,y;
          d=c=0;
          a[0]=0;
          b[0]=0;
          for(int i=0;i<32;i++)
          {
              for(int j=0;j<32;j++)
              {
                  b[c]=(unsigned long)(pow(2,i)*pow(3,j));
                  if(j==0 || ULONG_MAX/pow(3,j)>pow(2,i))
                  {
                     a[++d]=b[c++];
                    // cout<<i<<"\t"<<j<<"\t"<<a[d]<<endl;
                  }
                  else
                  {
                      break;
                  }
               }
           }
         sort(a,a+d);
         cout<<"enter element:";
         cin>>x;
         cout<<"its representation is :"<<endl;
         alg(a,d,x);
         system("PAUSE");
    [COLOR="Red"]     return 0;      // no return ! [/COLOR]
    }[/FONT]

    Remarks :
    (1) Your program is full of sh*t. You need to revise your C++ lessons.
    (2) Your algo implementations are really poor. Try to implement better algo.


    :)mad: Painfully) modified code:
    Code:
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    unsigned long bs(unsigned long a[], unsigned beg, unsigned end, unsigned long x)
    {
        unsigned long mid;
        mid=(beg+end)/2;
    
        if (x==a[mid])
        {
            cout << a[mid];
            return a[mid];
        }
        else if (beg>end)
        {
            cout<<a[end]<<" + ";
            return a[end];
        }
        else if (x<a[mid])
        {
            end=mid-1;
            return bs(a,beg,end,x);
        }
        else if (x>a[mid])
        {
            beg=mid+1;
            return bs(a,beg,end,x);
        }
    }
    
    void alg(unsigned long a[],unsigned d, unsigned long x)
    {
        unsigned long num;
        num=x-bs(a,0,d,x);
        if (num>0)
            alg(a,d,num);
    
    }
    
    const unsigned SIZE = 144;
    unsigned long a[SIZE],t,x,y;
    
    int main()
    {
        int c,n,d;
        d=c=0;
        a[0]=0;
        for (int i=0;i<12;i++)
            for (int j=0;j<12;j++)
                a[12*i+j]=(unsigned long)(pow(2.0,i)*pow(3.0,j));
    
        sort(a,a+SIZE);
        cout<<"Enter element : ";
        cin>>x;
        cout<<"Its representation is : "<<endl;
        alg(a,SIZE-1,x);
        putchar(10);
        putchar(10);
        system("PAUSE");
        return 0;
    }

    Sample run :
    Enter element : 655
    Its representation is :
    648 + 6 + 1

    Enter element : 36
    Its representation is :
    36

    Enter element : 38
    Its representation is :
    36 + 2

    Enter element : 444
    Its representation is :
    432 + 12

    Enter element : 555
    Its representation is :
    512 + 36 + 6 + 1

    Enter element : 23743
    Its representation is :
    23328 + 384 + 27 + 4

    Enter element : 25653
    Its representation is :
    23328 + 2304 + 18 + 3

    Enter element : 1
    Its representation is :
    1

    Enter element : 0
    Its representation is :
    0

    I repeat again, Please inspect your program yourself before throwing it into a forum.
     
    Last edited: May 28, 2009

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice