UVa 在线判断 - 3n + 1 - 错误答案



这是我来自UVA在线判断的3n + 1问题的C++代码,在这里运行良好,但每次提交都被认为是错误的解决方案。我相信这与输入或输出格式有关。我只是不知道问题到底是什么。谁能帮我调查这个问题?

#include <iostream>
using namespace std;
int main(){
    int i, j, ori, orj, complexity = 0;
    while(!cin.eof()){
      cin >> i >> j;
      ori = i;
      orj = j;
      if (i > j){
          int temp = i;
          i = j; 
          j = temp;
      }
    for (int k = i; k <= j; k++){
        int c = 1;
        int n = k;
        do{
            c++;
            if (n % 2 == 0)
                n /= 2;
            else
                n = 3 * n + 1;
        } while (n != 1);
        if (c > complexity)
            complexity = c;
      }
      cout << ori << " " << orj << " " << complexity << endl;
    }
 return 0;
}

每次提交都在时间限制内,当我调试时,我得到了正确的输出。

!cin.eof()不是

确定何时退出循环的好方法。

尝试更改

while(!cin.eof()){
  cin >> i >> j;

while(cin >> i >> j){

您必须为每个新输入数字清除复杂度变量的值。您的代码也无法正确处理 i 和 j 等于 1 的值。在这种情况下,您必须添加特殊条件,并且不要运行循环。所以这是整个代码的变化:

int main() {
    int i, j, ori, orj, complexity;
    while (!cin.eof()) {
        complexity = 0;
        cin >> i >> j;
        ori = i;
        orj = j;
        if (i > j) {
            int temp = i;
            i = j;
            j = temp;
        }
        if (j > 1) {
            for (int k = i; k <= j; k++) {
                int c = 1;
                int n = k;
                do {
                    c++;
                    if (n % 2 == 0)
                        n /= 2;
                    else
                        n = 3 * n + 1;
                } while (n != 1);
                if (c > complexity)
                    complexity = c;
            }
        } else {
            complexity = 1;
        }
        cout << ori << " " << orj << " " << complexity << endl;
    }
    return 0;
}

最新更新