poj1220(进制转换,短除法)

题意:进制转换,把a进制转换为b进制。

如果数据不大的话,那么这个题还是很简单的,但这个题就是数据范围太大,所以这里可以采用短除法来做。

 

关于短除法,就是把每一位(这里指的每一位是指个位十位之类的)除以要转换的进制的余数在乘以当前进制的值加到下一位去,当前位的值就为商,然后这样一直进行到最后一位(也就是个位)个位在对所须转换的进制在取模,那么这个模就是转换后的结果。多次重复,直到最后一位为0,从后往前看就是答案。

举个例子:50,要从十进制转换为二进制。

十位是5,个位是0,那么首先5/2商为2,余1

下一步就是1*10+0=10,然后个位就变成了10,然后10/2=5余0,0就是结果的个位,

然后下一步就是对25进行操作

2/2商1余0,那么十位就是1,个位就是0*10+5=5.

5/2商2余1,那么结果的十位就是1。

然后对12进行操作,十位是1,1/2商0余1,那么十位就为0了。

个位就是1*10+2=12.12/2商6余0,结果的百位就是0.

因为十位是0,所以只对个位进行操作了,6/2商3余0,千为就是0

3/2商1余1,万位为1.

1/2商0余1,十万位为1,所以50转换为二进制就是110010

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn=1000;
int t[maxn],ans[maxn];
char c[maxn];

int main(){
    //freopen("oooo.out","w",stdout);
    int a,b;
    int n;
    int k;
    scanf("%d",&n);
    while(n--){
        scanf("%d%d%s",&a,&b,c);
        int len=strlen(c);
        for (int i=0,j=len-1;i<len;i++,j--){
            if(c[j]<='Z'&&c[j]>='A'){
                t[i]=c[j]-'A'+10;
            }
            else if(c[j]<='z'&&c[j]>='a'){
                t[i]=c[j]-'a'+36;
            }
            else {
                t[i]=c[j]-'0';
            }
        }
        for (k=0;len;){
            for (int i=len-1;i>0;i--){
                t[i-1]+=t[i]%b*a;
                t[i]=t[i]/b;
            }
            ans[++k]=t[0]%b;
            t[0]/=b;
            while(len>0&&!t[len-1]) len--;
        }
        printf("%d %s\n",a,c);
        printf("%d ",b);
        for (int i=k;i>=1;i--){
            if(36<=ans[i]) printf("%c",ans[i]-36+'a');
            else if(ans[i]<36&&ans[i]>=10) printf("%c",ans[i]-10+'A');
            else printf("%d",ans[i]);
        }
        printf("\n\n");
    }
return 0;
}

 

posted @ 2018-04-29 21:40  lmjer  阅读(1742)  评论(0编辑  收藏  举报