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

时间:2018-01-12 03:02:20

标签: c++ crash numbers

所以我正在研究一个非常基本的#34;我的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然后崩溃,当它应该打印出来18976392134718,最后是1和8。有什么建议?谢谢!

1 个答案:

答案 0 :(得分:0)

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