poj1220进制转换,会了这题,基本上其他的高精度就差不多了。恢复功力,从基础开始……


#include<iostream>
#include<cstring>
using namespace std;
int tmp[1000],ans[1000],start[1000];
char s1[1000];
int p1,p2,len;
int turn()
{   int i;
    len=strlen(s1);
    for(i=1;i<=len;i++)
    {   
        if(s1[len-i]<='9'&&s1[len-i]>='0')
            start[i]=s1[len-i]-'0';
        else if(s1[len-i]>='A'&&s1[len-i]<='Z')
            start[i]=s1[len-i]-'A'+10;
        else start[i]=s1[len-i]-'a'+36;
    }
    start[0]=len;
}
int solve(int a,int b)
{   
    memset(tmp,0,sizeof(tmp));
    int i,j,yu;
    while(start[0]>=1)
    {   
        yu=0;
        i=start[0];
        ans[0]=start[0];
        while(i>=1)
        {   
            yu=yu*a+start[i];
            ans[i--]=yu/b;
            yu%=b;
        }
        tmp[++tmp[0]]=yu;
        i=ans[0];
        while(i>=1&&ans[i]==0)
        {   
            i--;
            ans[0]--;
        }
        memset(start,0,sizeof(start));
        for(i=0;i<=ans[0];i++)
        {
            start[i]=ans[i];
        }
        memset(ans,0,sizeof(ans));
    }
}
int output()
{   
    int i;
    printf("%d ",p1);
    printf("%s\n",s1);
    printf("%d ",p2);
    for(i=tmp[0];i>=1;i--)
    {
        if(tmp[i]>=10&&tmp[i]<36)
            printf("%c",'A'+tmp[i]-10);
        else if(tmp[i]>=36)
            printf("%c",'a'+tmp[i]-36);
        else   
            printf("%d",tmp[i]);
    }
    printf("\n");
    return 0;
}
int main()
{   int cas;
    scanf("%d",&cas);
    while(cas--)
    {   
        memset(start,0,sizeof(start));
        memset(ans,0,sizeof(ans));
        memset(tmp,0,sizeof(tmp));
        memset(s1,'\0',sizeof(s1));
        scanf("%d%d",&p1,&p2);
        scanf("%s",s1);
        turn();
        solve(p1,p2);
        output();
        printf("\n");
    }
    system("pause");
    return 0;
}