1010. Radix (25)

来源:互联网 发布:线切割直线编程怎么编 编辑:程序博客网 时间:2024/05/08 19:12

题目:1010. Radix (25)

#include <stdio.h>#include <string.h>long long TransDecimal(char s[],long long radix);long long BinSearch(long long n,char s[]);long long findMinRadix(char s[]);int compare(long long n,char s[],long long radix);int main(){    char s1[12],s2[12];    int tag;    long long radix,r;    scanf("%s %s %d %lld",s1,s2,&tag,&radix);    switch(tag)    {        case 1:r=BinSearch(TransDecimal(s1,radix),s2);break;        case 2:r=BinSearch(TransDecimal(s2,radix),s1);break;    }    if(r==-1)printf("Impossible");    else printf("%lld",r);}long long TransDecimal(char s[],long long radix){    long long n=0;    long long len=strlen(s),i;    for(i=0;i<len;i++)    {        if(s[i]>='0'&&s[i]<='9')        n=n*radix+s[i]-'0';        else if(s[i]>='a'&&s[i]<='z')        n=n*radix+s[i]-'a'+10;    }    return n;}long long BinSearch(long long n,char s[]){    long long leftRadix=findMinRadix(s),mid;    long long rightRadix=(n>leftRadix)?n+1:leftRadix+1;    while(leftRadix<rightRadix)    {        mid=(leftRadix+rightRadix)/2;        int ret=compare(n,s,mid);        if(ret==0)return mid;        else if(ret==1)        {            leftRadix=mid;        }        else if(ret==-1)        {            rightRadix=mid;        }    }    return -1;}long long findMinRadix(char s[]){    long long minRadix=-1;    int len=strlen(s),i;    for(i=0;i<len;i++)    {        if(s[i]>='0'&&s[i]<='9'&&s[i]-'0'>minRadix)        minRadix=s[i]-'0';        else if(s[i]>='a'&&s[i]<='z'&&s[i]-'a'+10>minRadix)        minRadix=s[i]-'a'+10;    }    return minRadix+1;}int compare(long long n,char s[],long long radix){    int i,len=strlen(s);    long long m=0;    for(i=0;i<len;i++)    {        if(s[i]>='0'&&s[i]<='9')m=m*radix+s[i]-'0';        else if(s[i]>='a'&&s[i]<='z')m=m*radix+s[i]-'a'+10;        if(n<m)return -1;//NOTE:m过大而产生溢出!    }    int ret;    if(n>m)ret=1;    else if(n==m)ret=0;    else ret=-1;    return ret;}
0 0