Tuesday, April 19, 2011

389 - Basically Speaking


#include<stdio.h>
#define M 40

char digit[20]="0123456789ABCDEF";
int FindMinBase(char[]);
unsigned long ToDec(char[],int);
int DecTo(unsigned long,int,char[]);

int main()
{
    int bx,by,l;
    unsigned long dx;
    char X[M],Y[M],Z[10000];
    //freopen("in.txt","r",stdin);

    while(gets(Z))
    {
        sscanf(Z,"%s%d%d",X,&bx,&by);

        dx=ToDec(X,bx);
        l=DecTo(dx,by,Y);

        if(l>7)
            printf("%7s\n","ERROR");
        else
            printf("%7s\n",Y);
    }
    return 0;
}

int FindMinBase(char A[])
{
    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;
}

int DecTo(unsigned long dec,int b,char num[])
{
    int d,i,k=0;
   
    if(!dec)
    {
        num[0]='0';
        num[1]='\0';
        return 1;
    }
    while(dec)
    {
        d=dec%b;
        dec=dec/b;
        num[k++]=digit[d];
    }
    d=k/2;
    for(i=0;i<d;i++)
    {
        num[i]=num[i]^num[k-i-1];
        num[k-i-1]=num[i]^num[k-i-1];
        num[i]=num[i]^num[k-i-1];
    }
    num[k]='\0';
    return k;
}

No comments:

Post a Comment

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