原题链接:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1546题目的意思很简单,给你一个n进制的数,让你把它转换成m进制,但是有一个限制,如果输出的数字大于7为的话无法在计算器上显示,所以要输出ERROR;
说说做这道题的体会吧,方法很easy,不过感觉代码写的长了点,第一个函数里用了map容器,后来发现其实并没有减少工作量,所以第二的函数里就干脆没使用了 O(∩_∩)O~
所犯的几个错误是 转换成desbase进制是,while循环里应该是num!=0,刚开始的时候写成了num/desbase!=0;呵呵
其次是发现不能在全局状态下往容器里面添加元素。害我总是编译不了,查了半天才知道的。。。
下面是我的代码:
#include <iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
map<char,int>amap;
char temp[100];
int oribase;
int desbase;
int convet(char a[],int oribase)
{
int len=strlen(a);
int i;
int result=0;
for(i=0;i<len;i++)
{
result+=amap[a[len-1-i]]*pow((double)oribase,i);
}
return result;
}
void convet2(int num,int desbase)
{
char test[100];
int i=0;
int testnum;
int len;
while(num!=0)
{
testnum=num%desbase;
num=num/desbase;
if(testnum==15)
test[i]='F';
else if(testnum==14)
test[i]='E';
else if(testnum==13)
test[i]='D';
else if(testnum==12)
test[i]='C';
else if(testnum==11)
test[i]='B';
else if(testnum==10)
test[i]='A';
else if(testnum==9)
test[i]='9';
else if(testnum==8)
test[i]='8';
else if(testnum==7)
test[i]='7';
else if(testnum==6)
test[i]='6';
else if(testnum==5)
test[i]='5';
else if(testnum==4)
test[i]='4';
else if(testnum==3)
test[i]='3';
else if(testnum==2)
test[i]='2';
else if(testnum==1)
test[i]='1';
else if(testnum==0)
test[i]='0';
i++;
}
test[i]='\0';
reverse(test,test+strlen(test));
strcpy(temp,test);
}
int main ()
{
amap['0']=0;amap['1']=1;amap['2']=2;amap['3']=3;
amap['4']=4;amap['5']=5;amap['6']=6;amap['7']=7;
amap['8']=8;amap['9']=9;amap['A']=10;amap['B']=11;
amap['C']=12;amap['D']=13;amap['E']=14;amap['F']=15;
int midresult;
int len;
while(scanf("%s%d%d",temp,&oribase,&desbase)!=EOF)
{
midresult=convet(temp,oribase);
convet2(midresult,desbase);
len=strlen(temp);
if(len>7)
{
printf(" ERROR\n");
}
else
printf("%7s\n",temp);
}
return 0;
}