1022 D进制的A+B

2019-03-08  本文已影响0人  初见还是重逢

输入两个非负 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;
}

代码:

D进制的A+B

//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;
}
上一篇 下一篇

猜你喜欢

热点阅读