输入两个非负 10 进制整数 A 和 B (≤2^30 −1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103
思路:
本题难度不大,主要是需要定义一个函数对十进制数进行转化,对十进制数转化的方法为对其进行求余运算,例如将56转化为7进制数,计算方法为:
56/7=8···0
8/7=1···1
1/7=0···1
直到除数结果为0,逆序记录余数,110即为56的7进制数
程序如下:
string tentoD(int number, int D)//根据进制数D将10进制数字转化为字符串
{
if (number == 0) return "0";//本题有一个注意点是A,B都为0的情况要予以考虑,有一个测试用例就是对0的结果的输出
vector<int> s;
string n;
while (number != 0)//进制数的转化,记录余数
{
s.push_back(number%D);
number /= D;
}
int temp;
while (!s.empty())
{
temp = *(s.end() - 1);//取最后一位数字,逆序即为转换后的字符串
n +='0' + temp;
s.pop_back();
}
return n;
}
定义好函数直接计算加和结果通过函数转化一下进制数即可。
注意本题有一个测试用例是A,B都为0,需要在函数中对0的情况加以考虑
另外,附上将D进制字符串转化为10进制数的方法:
//本函数需要include<stringstream>与<cmath>
int Dtoten(string a, int D)//字符串a是D进制数,需要将其转化为10进制数
{
int number=0;
for (int i = 0; i < a.size(); i++)
{
number += (a[i]-'0') * pow(D, a.size() - 1 - i);
}
return number;
}
代码:
//1022 D进制的A+B
//本题有一个注意点是A,B都为0的情况要予以考虑,有一个测试用例就是对0的结果的输出
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
string tentoD(int number, int D)//根据进制数D将10进制数字转化为字符串
{
if (number == 0) return "0";
vector<int> s;
string n;
while (number != 0)//进制数的转化,记录余数
{
s.push_back(number%D);
number /= D;
}
int temp;
while (!s.empty())
{
temp = *(s.end() - 1);//取最后一位数字,逆序即为转换后的字符串
n+='0' + temp;
s.pop_back();
}
return n;
}
int Dtoten(string a, int D)//将D进制的字符串a转化为10进制的整型
{
int number=0;
for (int i = 0; i < a.size(); i++)
{
number += (a[i]-'0') * pow(D, a.size() - 1 - i);
}
return number;
}
int main()
{
int A, B;
int D;
cin >> A >> B >> D;
int temp;
temp = A + B;
cout << tentoD(temp, D);
return 0;
}
网友评论