1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

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,283
    Likes Received:
    364
    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,343
    Likes Received:
    55
    Trophy Points:
    0
    Occupation:
    STUDENT !
    Location:
    Orissa, INDIA
    Home Page:
    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