17.小A的计算器

【问题描述】

        以往的操作系统内部的数据表示都是二进制方式,小A新写了一个操作系统,系统内部的数据表示为26进制,其中0-25分别由a-z表示。
        现在小A要在这个操作系统上实现一个计算器,这个计算器要能实现26进制数的加法运算。你能帮小A实现这个计算器吗?

【输入形式】

       输入的第一行包括一个整数N(1<=N<=100)。
       接下来的N行每行包括两个26进制数x和y,它们之间用空格隔开,每个数的位数最多为10位,我们可以保证相加的结果的位数最多也是10位。每个数会用小A所设计的操作系统中的表示方法来表示,如:bsadfasdf。即每个数的各个位均由26个小写字母a-z中的一个来表示。

【输出形式】

        输出x和y相加后的结果,结果也要用题目中描述的26进制数来表示。

【样例输入】

4
ba cd
c b
b c
ba c

【样例输出】

dd
d
d
bc

做题感悟:注意看清变量名呀,本以为此题比较简单,结果就因为变量名看错,活活debug一小时!!!

#include<bits/stdc++.h>
using namespace std;
int changechar(char );//转换单个字符为数字
int changestr(string);//转换26进制数为十进制
char changeint(int);//转换单个数字为字符
int main() {
	int n;
	cin>>n;
	cin.get();//吸收回车符 
	while(n--) {
		string x,y;
		string xy;
		getline(cin,xy);//读入一行字符串 
		stringstream ss;//利用字符串流实现分隔读入 
		ss<<xy;
		int sum=0;//转换成的十进制数
		ss>>x>>y;
		int numx=0;
		int numy=0;
		numx=changestr(x);//将相应的字符串转换为十进制数 
		numy=changestr(y);
		sum=numx+numy;//求和 
		stack<char>mystack;//利用栈进行结果输出 因为进行取余进制操作时是从个位开始,而输出必须从高位开始 
		while(sum) {//此循环将十进制转换为26进制 
			int ys;
			ys=sum%26;
			sum/=26;
			char cs=changeint(ys);
			mystack.push(cs);
		}
		while(!mystack.empty()) {//进行结果 
			cout<<mystack.top();
			mystack.pop();
		}
		cout<<endl;
	}
	return 0;
}
int changestr(string str) {
	int key=str.size()-1;
	int ssum=0;
	int sssum;
	for(int i=0; i<str.size(); i++) {
		sssum=changechar(str[i]);
		ssum+=sssum*pow(26,key);
		key--;
	}
	return ssum;
}
int changechar(char s) {
	switch(s) {
		case 'a':
			return 0;
		case 'b':
			return 1;
		case 'c':
			return 2;
		case 'd':
			return 3;
		case 'e':
			return 4;
		case 'f':
			return 5;
		case 'g':
			return 6;
		case 'h':
			return 7;
		case 'i':
			return 8;
		case 'j':
			return 9;
		case 'k':
			return 10;
		case 'l':
			return 11;
		case 'm':
			return 12;
		case 'n':
			return 13;
		case 'o':
			return 14;
		case 'p':
			return 15;
		case 'q':
			return 16;
		case 'r':
			return 17;
		case 's':
			return 18;
		case 't':
			return 19;
		case 'u':
			return 20;
		case 'v':
			return 21;
		case 'w':
			return 22;
		case 'x':
			return 23;
		case 'y':
			return 24;
		case 'z':
			return 25;
	}
}
char changeint(int ssss) {
	switch(ssss) {
		case 0:
			return 'a';
		case 1:
			return 'b';
		case 2:
			return 'c';
		case 3:
			return 'd';
		case 4:
			return 'e';
		case 5:
			return 'f';
		case 6:
			return 'g';
		case 7:
			return 'h';
		case 8:
			return 'i';
		case 9:
			return 'j';
		case 10:
			return 'k';
		case 11:
			return 'l';
		case 12:
			return 'm';
		case 13:
			return 'n';
		case 14:
			return 'o';
		case 15:
			return 'p';
		case 16:
			return 'q';
		case 17:
			return 'r';
		case 18:
			return 's';
		case 19:
			return 't';
		case 20:
			return 'u';
		case 21:
			return 'v';
		case 22:
			return 'w';
		case 23:
			return 'x';
		case 24:
			return 'y';
		case 25:
			return 'z';
	}
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值