所以我正在研究一个非常基本的#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。有什么建议?谢谢!
答案 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