Monday, December 26, 2016

UVa 343 What base is this

UVa 343 What base is this


I was too lazy when I saw this problem for the very first time 2 years ago. Solving problems that required parsing a string were too tedious for me back then. Well, guess what it generated a great code for future problems from this domain.

#include <stdio.h>
#include <math.h>
#include <string.h>
#define isChar(i) ((i>=A&&i<=Z)||(i>=0&&i<=9))
typedef unsigned long long ULL;
int vals[1000];
char input[1000], val1[1000], val2[1000];
ULL getVal(char *a, int base, int ln)
{
int len = ln, i;
ULL val=0;
for (i=len-1 ; i>=0 ; i--)
{
val = val + (vals[a[i]]) * (int)pow((double)base,(len-1-i));
}
return val;
}

int setVals()
{
int i;
for (i=0 ; i<=9 ; i++)
{
vals[i+0] = i;
}
for (i=A ; i<=Z ; i++)
{
vals[i] = (i-55);
}
}

int parser(char *a, int *l1, int *l2, int *mb1, int *mb2)
{
int i, j, min;
for (i=0 ; !isChar(a[i]) ; i++);
min=-1;
for (j=0 ; isChar(a[i]) ; i++, j++)
{
val1[j]=a[i];
if (vals[a[i]]>min)
min = vals[a[i]];
}
val1[j]=;
*l1=j;
*mb1=min+1;

for ( ; !isChar(a[i]) ; i++);
min=-1;
for (j=0 ; isChar(a[i]) ; i++, j++)
{
val2[j]=a[i];
if (vals[a[i]]>min)
min = vals[a[i]];
}
val2[j]=;
*l2=j;
*mb2=min+1;
}

int main()
{
int l1, l2, minb1, minb2, f, i, j;
setVals();

while (gets(input))
{
parser(input,&l1,&l2,&minb1,&minb2);

f=0;

for (i=(minb1>1?minb1:2) ; i<=36 && !f ; i++)
{
for (j=(minb2>1?minb2:2) ; j<=36 && !f ; j++)
{
if (getVal(val1,i,l1) == getVal(val2,j,l2))
{
printf("%s (base %d) = %s (base %d) ",val1,i,val2,j);
f=1;
}
}
}

if (!f) printf("%s is not equal to %s in any base 2..36 ",val1,val2);

}
return 0;
}


Go to link download