例5006 计算器设计
Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)
Total Submissions: 62 Accepted Submissions: 44
Problem Description
Really Neato计算器公司最近邀请你的团队为他们设计一款超级Neato一代计算器。作为计算机科学家,你建议该计算器能够在各种进制之间进行转换。他们认为这是一个很好的想法,并要求你的团队先给出实现进制转换的算法原型。公司经理告诉你,该计算器应该具有以下一些特征:
(1)可以显示7位;
(2)按键除了数字0到9外,还包括大写字母A到F;
(3)支持2~16进制。
Input
输入文件中的每行为一个进制转换,包括3个数,第1个数是原进制下的一个整数,第2个数就是原进制,第3个数是转换后的进制。这3个数的两边可能有一个或多个空格。输入数据一直到文件结尾。
Output
实现所有的进制转换,转换后的数右对齐到7位显示。如果转换后的数的位数太多,超过7位,则输出“ERROR”,也是右对齐到。
Sample Input
1111000 2 10
1111000 2 16
2102101 3 10
2102101 3 15
12312 4 2
1A 15 2
1234567 10 16
ABCD 16 15
Sample Output
120
78
1765
7CA
ERROR
11001
12D687
D071
解题思路:
#include <stdio.h>
#include <string.h>
long b2ten(char *x,int b);
int main()
{
char srcnum[10],destnum[10],temp[10];
char error[10] = "ERROR";
int src,dest,j;
long num;
while(~scanf("%s %d %d",srcnum,&src,&dest))
{
num = b2ten(srcnum,src);
if(dest==10)
{
if(num>9999999)
printf("%7s\n",error);
else
printf("%7ld\n",num);
}
else
{
j = 0;
while(num)
{
if(num%dest<10)
destnum[j++] = num%dest + '0';
else
{
switch(num%dest)
{
case 10:destnum[j++] = 'A';break;
case 11:destnum[j++] = 'B';break;
case 12:destnum[j++] = 'C';break;
case 13:destnum[j++] = 'D';break;
case 14:destnum[j++] = 'E';break;
case 15:destnum[j++] = 'F';break;
}
}
num /= dest;
}
destnum[j] = '\0';
if(strlen(destnum)>7)
{
printf("%7s\n",error);
}
else
{
int i = 0;
for(int k = j-1;k>=0;k--)
{
temp[i++] = destnum[k];
}
temp[i] = '\0';
printf("%7s\n",temp);
}
}
}
return 0;
}
long b2ten(char *x,int b)
{
int ret = 0;
for(int i = 0;i<strlen(x);i++)
{
ret *= b;
if(x[i]-'0'<=9)
{
ret += x[i]-'0';
}
else
{
switch(x[i])
{
case 'A':ret += 10;break;
case 'B':ret += 11;break;
case 'C':ret += 12;break;
case 'D':ret += 13;break;
case 'E':ret += 14;break;
case 'F':ret += 15;break;
}
}
}
return (long)ret;
}