亮亮做加法 XDU1003

来源:互联网 发布:战地之王刷枪软件 编辑:程序博客网 时间:2024/05/01 14:49

1.题目描述:点击打开链接

2.解题思路:本题要求输入两个b进制整数X,Y,输出他们相加后的b进制的结果。本题据说可以直接用Java的特性很方便的解决。但这里还是介绍如何利用C++来解决。其实思路很简单,模拟b进制数相加的过程即可。先把输入的X,Y转化为十进制整数,相加得到十进制的和后再转化为b进制即可。不过其中有一些要注意的地方:(1)注意结果是0的时候。(2)由于题目中说答案的最大范围不超过18位,应该用long long。我交了好几次才发现这一点==看来对数据范围还是不太敏感啊。

3.代码:

#define _CRT_SECURE_NO_WARNINGS #include<iostream>#include<algorithm>#include<string>#include<sstream>#include<set>#include<vector>#include<stack>#include<map>#include<queue>#include<deque>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<functional>using namespace std;char ans[50];typedef long long ll;ll cal(char*s,int b)//转化为十进制数{ll x = 0;int len = strlen(s);for (int i = 0; i < len; i++)if (isdigit(s[i]))x = x * b + s[i] - '0';else x = x * b + s[i] - 'A' + 10;return x;}void solve(ll res, int b)//结果转化为b进制数{int p = 0;if (!res)ans[p] = '0';elsewhile (res>0){int m = res%b;if (m > 9)ans[p++] = m - 10 + 'A';else ans[p++] = m + '0';res /= b;}}int main(){//freopen("t.txt", "r", stdin);int b;char s[50], t[50];ll x, y, res;while (~scanf("%d", &b)){scanf("%s%s", s, t);memset(ans, '\0', sizeof(ans));x = cal(s, b);y = cal(t, b);res = x + y;solve(res, b);int len = strlen(ans);for (int i = len - 1; i >= 0; i--)putchar(ans[i]);puts("");}return 0;}

0 0