Tuesday, April 19, 2011

343 - What Base Is This?

#include<stdio.h>
#define M 40

int FindMinBase(char[]);
unsigned long ToDec(char[],int);

int main()
{
    unsigned long i,j,k,mbx,mby,s;
    unsigned long dx,dy;
    char X[M],Y[M],Z[10000];
    freopen("in.txt","r",stdin);

    while(gets(Z))
    {
        sscanf(Z,"%s%s",X,Y);

        mbx=FindMinBase(X);
        mby=FindMinBase(Y);

        s=0;
        for(i=mbx;i<=36;i++)
        {
            dx=ToDec(X,i);
            for(j=mby;j<=36;j++)
            {
                dy=ToDec(Y,j);
                if(dx==dy)
                {
                    printf("%s (base %d) = %s (base %d)\n",X,i,Y,j);
                    s=1;break;
                }
            }
            if(dx==dy)break;
        }
        if(!s)printf("%s is not equal to %s in any base 2..36\n",X,Y);
    }
    return 0;
}

int FindMinBase(char A[])
{
    char ch;
    int i,b,mb=2;

    for(i=0;A[i];i++)
    {
        if(A[i]<65)
            b=A[i]-47;
        else
            b=A[i]-54;
        if(mb<b)mb=b;
    }
    return mb;
}

unsigned long ToDec(char A[],int b)
{
    unsigned long dec=0,p=1;
    int i,d,l;
    for(l=0;A[l];l++);
    for(i=l-1;i>=0;i--)
    {
        if(A[i]<65)
            d=A[i]-48;
        else
            d=A[i]-55;

        dec=dec+d*p;
        p=p*b;
    }
    return dec;
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.