您的位置:首页 > 其它

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

2016-04-20 20:16 429 查看
题目链接: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: