进制转化:N进制转化为10进制

输入:N [<35,数字的字符串其中包括0-9和a-z(表示10-35)]进制的字符串

输出:对应的10进制数

#include<iostream>     
#include<string>
#include<map>

using namespace std;      

// 构造字符所对应的十进制值
map<string,int> Init_dict()
{
	map<string,int> dict;
	string str = "0123456789abcdefghijklmnopqrstuvwxyz";	
	for(string::size_type i = 0;i < str.size();i++)
	{
		dict.insert(make_pair(str.substr(i,1),i));
	}
	return dict;
}

// 字符串转化为十进制
double ToDeci(string str,int m,map<string,int> dict)
{
	double sum = 0;
	int n = str.size();
	// 切分每一个字符,求十进制
	for(string::size_type i = 0;i < str.size();i++)
	{
		string tmp;
		tmp = str.substr(i,1);
		int num;
		num = dict[tmp];
		sum += num * pow(double(m),double(n-i-1));
	}
	return sum;
}


int main(void)   
{   
	string str;
	string ch_str = "0123456789abcdefghijklmnopqrstuvwxyz";

	cout << "输入需要转化的字符串 ,只能包括( 0-9,a-z) :" << endl;
	map<string,int> dict;
	dict = Init_dict();
	while(1)
	{
		cin >> str;
		if(str.find_first_not_of(ch_str)!=str.npos)
		{
			cout << "输入有误,请重新输入,只能包括( 0-9,a-z) :" << endl;
		}
		else
			break;
	}

	int ary;
	cout << "请输出当前字符串的进制(2-34) :" << endl;
	

	while(1)
	{
		cin >> ary;
		int max = 0;
		for(string::size_type i = 0;i < str.size();i++)
		{
			int num;
			string tmp;
			tmp = str.substr(i,1);
			num = dict[tmp];
			if(num > max)
			{
					max = num;
			}
		}
		if(max >= ary)
			cout << "字符串与进制不想符(进制太小,字符太大),请重新输入" << endl; 
		else 
			break;
	}
	cout << "--------------------------" << endl;
	double sum = ToDeci(str,ary,dict);
	cout << ary << "进制 " << str << " 转化为十进制是: " << sum << endl;  
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值