进制转换---由任意进制转为任意进制---NOJ1592

来源:互联网 发布:大富翁数据 编辑:程序博客网 时间:2024/06/05 16:59

题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1592

这个题完全是考验基本功的/(ㄒoㄒ)/~~
首先将之前进制数转为10进制,再将10进制数转为之后进制数。
由于涉及字母的问题,所以也不是那么容易处理的。
这里给出两种方法把,首先是常规做法,然后是stack做法。

常规做法:

 #include <iostream> #include <cstdio>#include <cstring> using namespace std;char bNum[300];//储存最后的进制数int a[300];int be,la;long  toTen(char a[], int bit) //任意进制转10进制{    int length = strlen(a);        int i,b=1;    long sum=0;     for(i=length-1;i>=0;i-- )     {        if(a[i]>='A')         {            sum += (a[i]-'A'+10) *b;            b *= bit;         }        else        {            sum += (a[i]-'0') *b;            b *= bit;         }     }     return sum; } void TentoOther(long num,int la) //10进制数转任意进制数{    int yushu,i=0;    while(num>0)     {         yushu=num%la;         a[i++]=yushu;         num=num/la;     }     for(int j=i-1;j>=0;j--)    {        if(a[j]>=10)        bNum[j]=a[j]-10+65;        else        bNum[j]=a[j]+48;//48是‘0’的ASCLL码值    }    return ;}int main(){    //freopen("input.txt", "r", stdin);    //freopen("output.txt", "w", stdout);    int T;    cin>>T;    int q=0;    while(T--)    {            char str[30];        memset(str,0,sizeof(str));        memset(bNum,0,sizeof(bNum));        memset(a,0,sizeof(a));        q++;        scanf("%s",str);        scanf("%d%d",&be,&la);        if(str[0]=='0')//特判0的情况,在这里WA好多发/(ㄒoㄒ)/~~        {            printf("Case %d: ",q);            cout<<0;            printf("(%d):",be);            cout<<0;            printf("(%d)",la);            cout<<endl;            continue;        }        int l=strlen(str);        long ten=toTen(str,be);        TentoOther(ten,la);        int l1=strlen(bNum);           printf("Case %d: ",q);           for(int i=0;i<l;i++)           cout<<str[i];           printf("(%d):",be);           for(int i=l1-1;i>=0;i--)//记得倒着输出           cout<<bNum[i];           printf("(%d)",la);           cout<<endl;    }    return 0; }

stack做法主要处理的是10进制转任意进制的情况,利用stack先进后出的特性,每次把余数都压进去,最后输出时从最底层开始弹出,这样实现了自底而上的过程。

代码如下:

#include <cstdio>#include <iostream>#include <cstring>#include <stack>using namespace std;int before, after,t, kase = 0;char s[40];const char map[36]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};stack<char> ans;int main(int argc, char const *argv[]){    scanf("%d", &t);    while(t--)    {        scanf("%s%d%d", s, &before, &after);        int len = strlen(s);        int flag = 1, sum = 0;//sum是任意进制转为10进制        for(int i = len-1; i >=0; i--)        {            if(s[i] >= 'A')                 sum +=((10+ s[i] - 'A') *flag) ;            else sum += (s[i] - '0')*flag;            flag *= before;        }        int a;                    ans.push(map[sum%after]);//不用特判0了;                    while(sum/=after)                    {                        a=sum%after;                        ans.push(map[a]);//记录每次余数对应的值压入stack中                   }                   printf("Case %d: ", ++kase);                   printf("%s(%d):", s, before);                   while(!ans.empty())                    {                       printf("%c",ans.top());                        ans.pop();                    }                   printf("(%d)\n",after);    }    return 0;}

仅代表个人观点,欢迎探讨交流,勿喷~
这里写图片描述

PhotoBy:WLOP

http://weibo.com/wlop

0 0