1022 D进制的A+B

1022 D进制的A+B

输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1

输入格式:

输入在一行中依次给出 3 个整数 A、B 和 D。

输出格式:

输出 A+B 的 D 进制数。

输入样例:

123 456 8

输出样例:

1103

当然我自己写的代码逻辑是正确的,但是把自然语言逻辑变成真正的代码,就会出现很多问题。、

 先放自己的写的

#include 
#include 
using namespace std;

int main() {
	int A,B,D;
	cin >> A >> B >> D;
    int C=A+B;
    std::vectorp;
    while(C>D){
    	int t=C%D;
    	int i=0;
		p[i] = t;
		i++; 
    	C=C/D;
	}
	int i=p.size();
	p[i+1]=C;
	int si=(i+1);
	for(int j=0;j<(si/2);j++){
		p[j]=p[si-1];
		si=si-1;
		cout<

1.std::vectorp; 这行代码创建一个空的向量 p,但我在之后的循环中尝试访问它的元素,这会导未定义行为。应该在创建 p 向量时指定其大小,或者使用 push_back 函数来添加元素。

2.int i=0; 应该在循环之外进行初始化,否则在每次循环迭代时都会重置为0。

3.p[i] = t; 这行代码试图访问向量 p 中的一个位置,但由于 p 的大小尚未设置,会导致越界错误。应该使用 push_back 来添加元素到向量。

4.p[i+1]=C; 这行代码也会导致越界错误,因为我在前面没有添加足够的元素到向量 p 中。

5.在循环中,我试图颠倒 p 向量中的元素,但这部分代码也存在问题,因为它没有正确地颠倒元素。

6.没有考虑A+B可能是为0的特殊情况


放上修改后的正确代码:


#include 
#include 
using namespace std;

int main() {
    int A, B, D;
    cin >> A >> B >> D;
    int C = A + B;
    vector p;//因为不知道初始数组长度,所以设置动态数组 

    while (C > 0) {  //计算进制循环结束的标志是C>0而不是C>D 
        int t = C % D;
        p.push_back(t);//为动态数组键入数值 
        C = C / D;
    }

    if (p.empty()) {  //处理特殊情况,即当A + B等于0时 
        p.push_back(0);
    }

    int size = p.size();
    for (int i = size - 1; i >= 0; i--) { //逆序输出直接从p[i]输出而不是从p[0]输出即可 
        cout << p[i];
    }
    
    return 0;
}

1022 D进制的A+B_第1张图片

你可能感兴趣的:(算法,数据结构)