noi.openjudge 1.13.44

http://noi.openjudge.cn/ch0113/44/

总时间限制: 
1000ms
内存限制: 
65536kB
描述

将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为[2,36],其中,用到的数码按从小到大依次为:0,1,2,3,4,5,6,7,8,9,A,B,...,Z,不考虑小写字母



。 

输入


一共1+m 行: 
第1行为 m,表示后面有 m 行(1 <= m <= 60). 
其后的m行中,每行3个数: 进制p,p进制数n,以及进制 q。 
三个数之间用逗号间隔。
n 的长度不超过50位。输出转换后的 q 进制数。样例输入
6
18,2345678A123,18
15,23456,18
12,2345678,20
16,12345678,23
25,3456AB,21
18,AB1234567,22
样例输出
2345678A123
114E0
22B7A4
21A976L
7C2136
22JF0G367


思路:

    对于这一题来说,肯定是要用到字符串来模拟计算的,但是你会发现事情没有那么简单,它不想大整数加法那样可以直接来进行计算,我能想到的就是现将其转换为10进制,再转换为其他进制,那么在这个时候,又要用到大整数的加法了,写起来并不是不可以,可是我觉得太麻烦了,于是这一题就一直放在这里,直到我看见一篇好文:浅谈大数进制转换

这是AC代码:

其实还有一个问题在我心中没有解决,那就是在进行一次除法运算之后,为什么这个数还是p进制的,它不是明明已经*p变为十进制的数了吗?


#include<stdio.h>
#include<string.h>
char c[200];
int s[200];
int a,b;
int ans[200];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s",c);
        int l=strlen(c);
        b=a=0;
        int t;
        int y=0;
        for(t=0;t<l;t++){
            if(c[t]==','){break;}
            a=a*10+c[t]-48;
        }
        for(t++;t<l;t++){
            if(c[t]==','){s[y]=0;break;}
            if(c[t]>=48&&c[t]<=57){
                s[y++]=c[t]-48;
            }
            else if(c[t]>=65&&c[t]<=90){
                s[y++]=c[t]-55;
            }
        }
        for(t++;t<l;t++){
            b=b*10+c[t]-48;
        }
        memset(c,0,sizeof(c));

        int rec;
        int k=y;
        int p=0;
        int book=1;
        while(book){
           rec=0;
            for(int i=0;i<k;i++){
                rec=rec*a+s[i];
                s[i]=rec/b;
                rec=rec-s[i]*b;
            }
            ans[p++]=rec;
            book=0;
            for(int i=0;i<k;i++){
                if(s[i]!=0){book=1;break;}
            }
        }
        int flag=0;
        for(int i=p-1;i>=0;i--){
            if(ans[i]!=0){flag=1;}
            if(flag==1){
                if(ans[i]>=10){printf("%c",ans[i]+55);}
                else printf("%d",ans[i]);
            }
        }
        if(flag==0){printf("%d",0);}
        printf("\n");
        memset(ans,0,sizeof(ans));
    }
}

posted @ 2018-04-06 17:00  断腿三郎  阅读(511)  评论(0编辑  收藏  举报