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

时间:2016-03-03 04:34:03

标签: c++ algorithm

这是the 3n+1 problem from UVA online judge的我的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;
}

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

2 个答案:

答案 0 :(得分:0)

!cin.eof()不是确定何时退出循环的好方法。

尝试更改

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

while(cin >> i >> j){

答案 1 :(得分:0)

您必须为每个新输入数字清除复杂性变量的值。您的代码也没有正确处理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;
}