例5006 计算器设计

例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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值