1022 D进制的A+B
输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103
当然我自己写的代码逻辑是正确的,但是把自然语言逻辑变成真正的代码,就会出现很多问题。、
先放自己的写的
#include <iostream>
#include <vector>
using namespace std;int main() {int A,B,D;cin >> A >> B >> D;int C=A+B;std::vector<int>p;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<<p[j]<<endl;} return 0;
}
1.std::vector<int>p; 这行代码创建一个空的向量 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 <iostream>
#include <vector>
using namespace std;int main() {int A, B, D;cin >> A >> B >> D;int C = A + B;vector<int> 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;
}