第八届蓝桥杯C/C++B组个人决赛36进制

本文介绍了一种将36进制数字转换为10进制的方法,并通过具体的例子进行了演示。通过创建映射表并运用数学公式完成了转换。

36进制

对于16进制,我们使用字母A-F来表示10及以上的数字。
如法炮制,一直用到字母Z,就可以表示36进制。

36进制中,A表示10,Z表示35,AA表示370

你能算出 MANY 表示的数字用10进制表示是多少吗?

请提交一个整数,不要填写任何多余的内容(比如,说明文字)

 

结果:1040254

 

思路:A表示10,Z表示35,我们需要将英文字母和数字对应起来,显然我们需要用到map来存储键值对

将任意进制数转换成十进制,是同一个方法,公式如下:number(10进制)=原数第一位*原数进制的0次方+原数第二位*原数进制的1次方+原数第三位*原数进制的2次方+...+原数第n位*原数进制的n-1次方

 

具体思路如下:

1.申明一个map<string,int>,用英文字母索引数字,将“键值对1”-1,...,“9”-9,“A”-10,..."Z"-35存入map中

声明一个字符串,用来存储需要转换的36进制数

声明一个int型变量sum,初始化为0,,用来累加,

声明一个int 型变量length,用来存储36进制数字的长度

2.用string的strsub方法截取s的倒数第一个字母,用map通过字母找到该字母对应的数字,sum=sum+map[string.strsub(length-1,1)]*pow(36,length-1);

3.用string的strsub方法截取s的倒数第二个字母,用map通过字母找到该字母对应的数字,sum=sum+map[string.strsub(length-2,1)]*pow(36,length-2);

 .................此处省略n-3步...............

n.用string的strsub方法截取s的第一个字母,用map通过字母找到该字母对应的数字,sum=sum+map[string.strsub(0,1)]*pow(36,0);

最后输出结果即可

 

代码如下:

#include<iostream>
#include<math.h>
#include<map>
using namespace std;
int main() {
	map<string,int> mapNumber;
	mapNumber.insert(pair<string,int>("1",1));
	mapNumber.insert(pair<string,int>("2",2));
	mapNumber.insert(pair<string,int>("3",3));
	mapNumber.insert(pair<string,int>("4",4));
	mapNumber.insert(pair<string,int>("5",5));
	mapNumber.insert(pair<string,int>("6",6));
	mapNumber.insert(pair<string,int>("7",7));
	mapNumber.insert(pair<string,int>("8",8));
	mapNumber.insert(pair<string,int>("9",9));
	mapNumber.insert(pair<string,int>("A",10));
	mapNumber.insert(pair<string,int>("B",11));
	mapNumber.insert(pair<string,int>("C",12));
	mapNumber.insert(pair<string,int>("D",13));
	mapNumber.insert(pair<string,int>("E",14));
	mapNumber.insert(pair<string,int>("F",15));
	mapNumber.insert(pair<string,int>("J",16));
	mapNumber.insert(pair<string,int>("H",17));
	mapNumber.insert(pair<string,int>("I",18));
	mapNumber.insert(pair<string,int>("G",19));
	mapNumber.insert(pair<string,int>("K",20));
	mapNumber.insert(pair<string,int>("L",21));
	mapNumber.insert(pair<string,int>("M",22));
	mapNumber.insert(pair<string,int>("N",23));
	mapNumber.insert(pair<string,int>("O",24));
	mapNumber.insert(pair<string,int>("P",25));
	mapNumber.insert(pair<string,int>("Q",26));
	mapNumber.insert(pair<string,int>("R",27));
	mapNumber.insert(pair<string,int>("S",28));
	mapNumber.insert(pair<string,int>("T",29));
	mapNumber.insert(pair<string,int>("U",30));
	mapNumber.insert(pair<string,int>("V",31));
	mapNumber.insert(pair<string,int>("W",32));
	mapNumber.insert(pair<string,int>("X",33));
	mapNumber.insert(pair<string,int>("Y",34));
	mapNumber.insert(pair<string,int>("Z",35));
	string s;
	s="MANY";
	int length=s.size();
	int sum=0;
	for(int i=0; i<length; i++) {
		sum=sum+mapNumber[s.substr(i,1)]*pow(36,length-i-1);
	}
	cout<<sum<<endl;

	return 0;
}

感谢小哥哥,小姐姐看到了这里,Thanks♪(・ω・)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值