为什么USACO评分者不接受我的“Prime Cryptarithm”解决方案?(我的电脑和在线评分员之间的输出差异)

时间:2016-07-12 21:35:21

标签: c++ c++11

我正在编写问题http://acmph.blogspot.com/2010/12/usaco-prime-cryptarithm.html

的解决方案

当我在计算机上运行它时,给定输入数据

(1|var5)

我的电脑给了我384的答案,这是正确的答案。但是当我将它上传到USACO网站时,它说我的程序输出1.为什么会发生这种情况? 这是我的代码:

7
4 1 2 5 6 7 3

1 个答案:

答案 0 :(得分:2)

oneof1check函数中,不会为函数中的所有返回路径返回值。因此,您的程序显示未定义的行为,因为从返回值的函数返回任何内容都不是UB。这就是为什么你在不同的计算机/系统上运行时会得到不同的答案。

要解决此问题,请在true函数中返回oneof1,然后为false函数返回check

bool oneof1(int n) {
    int count1 = 1;
    while (true) {
        if (count1 > n)break;
        else {
            count1 = count1 * 10;
            int digit = n%count1 / (count1 / 10);
            if (!count(digits.begin(), digits.end(), digit) ){
                return false;
            }
            n = n - n%count1;
        }
    }
    return true;  // this was missing
}

 bool check() {
    int n = abc*e;
    int n1 = abc*d;
    if (n > 999 || n < 100)return false;
    if (n1 > 999 || n1 < 100)return false;

    if ((n1 * 10 + n) > 9999 || (n1 * 10 + n) < 1000)return false;
    if (oneof1(n) && oneof1(n1) && oneof1(n1 * 10 + n)) {
        return true;
    }
    return false;  // this was missing
}

当您编写一个不为所有返回路径返回值的函数时,大多数编译器都会发出警告。请将您的警告设置为至少提供此信息的级别(或者,如果您这样做,请阅读编译器提供给您的警告)。