C ++程序不对......除非我把cout放在循环中?

时间:2014-12-03 14:51:58

标签: c++ palindrome

您可能会从Project Euler中认识到这一点。我正在尝试编写一个代码,以便从三位数字乘以找到最大的回文数。有cout<< i<< ENDL;在for循环中指示我们在过程中的位置。如果您完全按原样运行该代码,那么我将获得答案,但如果我取出cout<< i<< ENDL;然后我似乎得到零。

我不确切知道发生了什么,代码似乎工作取决于我是否包括cout来表明我在哪里......什么?

#include <iostream>

using namespace std;

bool palindromecheck(int x);

int main() {
  int largest=0;

  for (int i = 999; i > 0; i--) {
    cout << i << endl;
    for (int j = 999; j > 0; j--) {
      if (palindromecheck(i*j) && i*j > largest) {
        largest = i*j;
      }
    }
  }

  cout << "The largest palindrome made from multiplying two 3-digit numbers is " << largest << endl;
}


bool palindromecheck(int x) {
  int z = x;
  int y;

  while (z != 0) {
    while (z%10 != 0) {
      z -= 1;
      y += 1;
    }

    while (z%10 == 0 && z != 0) {
      z /= 10;
      y *= 10;
    }
  }

  return x==y;
}

4 个答案:

答案 0 :(得分:5)

函数y内的局部变量palindromecheck()未初始化。这使得程序的行为无法预测。

当包含行cout << i << endl;时,y会以一个使您的程序看起来正常工作的值开始。如果未包含y,则会使用不同的值初始化y,但它不再有效。

在这两种情况下,它只是看起来像一样有效。实际上,程序的行为是未定义的。

在外部循环之前(在其声明上)正确初始化{{1}}。

答案 1 :(得分:3)

y变量没有初始值。这可能会导致不一致。

答案 2 :(得分:0)

你必须初始化y,这将使你的代码正常工作。

答案 3 :(得分:0)

不是您问题的答案,只是函数palindromecheck()的简化版本:

bool palindromecheck(int x)
{
  int z = x;
  int y = 0;

  while (z != 0) {
    // Transfer the last digit of z to the end of y
    y = 10 * y + z % 10;
    z /= 10;
  }

  return x == y;
}

(包括y的正确初始化)