您的位置:首页 > 其它

poj 2710:数制转换

2013-12-01 15:05 190 查看

2710:数制转换

总时间限制: 1000ms 内存限制: 65536kB

描述求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。

不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
输入输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。

a,b是十进制整数,2 =< a,b <= 16。
输出输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
样例输入
15 Aab3 7


样例输出
210306


提示可以用字符串表示不同进制的整数


#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<cstring>
using namespace std;
int main()
{
	int a,b,sum;
	char arr[]="0123456789abcdef";   //预处理
	const int arrsize=sizeof(arr)/sizeof(char);
	char s[50];
	while(cin>>a>>s>>b)  //输入
	{	
		if(s[0]=='0')   //判断输入是否为0,是则输出0,继续下一组输入
		{cout<<"0"<<endl;
		continue;}
		int t=1;
		int len=strlen(s);
		stack<char> St;   //声明栈
		sum=0;
		for(int i=0;i<len;i++)
			St.push(tolower(s[i]));   //将输入的整数按小写入栈
			while(!St.empty())     //一个个出栈,然后判断该字符在arr数组中的位置,然后进行累乘,累加
			{
				for(int j=0;j<arrsize;j++)
				if(St.top()==arr[j])
				{
				//	cout<<St.top();
					sum+=(j*t);
					t*=a;
					St.pop();
					j=0;
				break;
				}
			}
		//	cout<<sum;
		while(sum)   //以上步骤得到一个将把a换转成10进制的数sum
			St.push(arr[sum%b]);   //然后按照除数取余法入栈
			sum/=b;
		}
		
		while(!St.empty())  //按顺序出栈,即得到结果
		{
			cout<<St.top();
			St.pop();
		}
		cout<<endl;

	}
  return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: