程序崩溃,不显示正确的输出

Program crashes and does not display correct output

本文关键字:输出 显示 崩溃 程序      更新时间:2023-10-16

所以我正在为我的c ++类解决一个非常"基本"的问题,并遇到了一些错误。问题是这个

数论中一个有趣的问题有时被称为"项链问题"。此问题从两个个位数开始。下一个数字是通过将前两个数字相加并仅保存一位数字来获得的。重复此过程,直到"项链"通过返回到原来的两个数字关闭。例如,如果起始数字是 1 和 8,则需要十二个步骤才能关闭"项链": 18976392134718 编写一个程序,要求用户输入两个起始编号,然后显示顺序和所执行步骤数。程序输出应类似于: 输入第一个数字:1 输入第二个数字:8 18976392134718 您的数字需要 12 个步骤。

我所做的是这样的:

` #include <iostream>
using namespace std;

int necklace(){
int firstNumber, secondNumber, total = 0, counter = 10, sumOfTwo, tempOne, tempTwo, count;

// 2 single digit numbers
// add first two numbers and save only one digit
// process keeps going until original numbers are found
cout << "Enter the first number: n";
cin >> firstNumber;
cout << "Enter the second number: n";
cin >> secondNumber;
sumOfTwo = firstNumber + secondNumber;
while (sumOfTwo >= 10){
sumOfTwo /= 10;
}
int numbersArray[] = {firstNumber, secondNumber, sumOfTwo};
for(int i = 0; i <= 20; i++){

tempOne = numbersArray[i + 1];
tempTwo = numbersArray[i + 2];

sumOfTwo = tempOne + tempTwo;
while (sumOfTwo >= 10){
sumOfTwo %= 10;
}
numbersArray[i + 3] = sumOfTwo;

total++;
if(tempOne == firstNumber && tempTwo == secondNumber){
break;
}

}

for(int i = 0; i < sizeof(numbersArray); i++){
cout << numbersArray[i];
}
cout << endl << "It took " << total << " steps to finish. n";
return total;
}

int main() {
necklace();

}

`

我遇到的问题是它会打印出除原始 2 之外的所有数字,例如,如果我使用带有 1 和 8 的示例,它将打印出 189763921347 然后崩溃,当它应该打印出带有 1 和 8 的18976392134718时。有什么建议吗?谢谢!

int numbersArray[] = {firstNumber, secondNumber, sumOfTwo};

右侧有三个元素,使其成为大小为 3 的数组。索引为 0、1 和 2 的含义。
使用较高的索引将导致未定义行为 (UB)。

另一方面:

for(int i = 0; i <= 20; i++){
tempOne = numbersArray[i + 1];
tempTwo = numbersArray[i + 2];
[...]
numbersArray[i + 3] = sumOfTwo;

i最多 20 个(包含)索引,最后一行从 0 到 23 的相同数组!

下一个:

for(int i = 0; i < sizeof(numbersArray); i++){

sizeof(numbersArray)返回数组的大小(以字节为单位):

sizeof(numbersArray) = 3 * sizeof(int)

大于 3,数组的实际大小。


但是,如果您打算打印值但不存储它们,则不需要数组。您只需要"交换"这样的值:

one two   // beginning of loop
___|
|    __ new_digit
|   |
v   v
one two   // end of loop