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

题目链接: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;
}

仅代表个人观点,欢迎探讨交流,勿喷~
进制转换---由任意进制转为任意进制---NOJ1592_第1张图片

PhotoBy:WLOP

http://weibo.com/wlop

你可能感兴趣的:(进制转换---由任意进制转为任意进制---NOJ1592)