程序在编译器中运行但在在线判断中返回运行时错误

时间:2017-07-18 11:29:03

标签: c++ runtime-error onlinejudge

我正在尝试使用以下代码在此在线评判中解决此问题:https://a2oj.com/ladder?ID=3(请参阅下面的问题)。它在编译器上成功运行,但在在线判断时返回运行时错误。

编辑:更改循环条件后的代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

struct count {
    int number;
    int repetitions;
};

bool sortByNumber(const struct count &lhs, const struct count &rhs) { 
    return lhs.number < rhs.number;
}

int main() {
    vector <int> input;
    int n = 0;
    do {
        cin>>n;
        input.push_back(n);
    } while (n != 0);

    struct count x[101] = {NULL};

    for (int j = 0; j < input.size(); j++) {
        int tracker = 0;
        for (int z = 0; z < input.size(); z++) {
            if (input[j] != x[z].number) {
                tracker++;
            }
        }
        if (tracker == input.size()) {
            x[j].number = input[j];
        }
    }

    sort(x, x+101, sortByNumber);

    for (int y = 0; y < 101; y++) {
        for (int w = 0; w < input.size(); w++) {
            if (x[y].number == input[w]) {
                x[y].repetitions++;
            }
        }
    }

    for (int v = 0; v < 101; v++) {
        if (x[v].number != 0) {
            cout << x[v].number << " " << x[v].repetitions << endl;
        }
    }

    return 0;
}

我对编程很新,所以如果答案很明显而且我看不清楚,我会道歉。我研究了运行时错误的原因,我看不到任何内存泄漏,逻辑错误或零除。我唯一能想到的是它是由许多嵌套循环引起的分段错误(这段代码比我提交给在线裁判的其他程序使用了更多的内存和运行时间),但我想不出另一个解决这个问题的方法。任何想法,甚至只是在哪里看,都会非常感激。

编辑:问题 问题陈述: Amgad在一家大商店找到了一份收银员的工作,每天都有数千美元。作为收银员,他必须计算每天结束时每张美元钞票(钞票)的金额。

Amgad希望您通过编写计算机程序来帮助他,这样Amgad就可以输入每个账单的金额,并分别计算每个账单。

输入格式: 一个或多个以零结尾的正数,每个数字介于1到100之间

输出格式: 在一行中只打印一次,然后是重复次数

示例输入: 100 20 五 2 10 20 五 五 20 100 10 2 2 10 五 0

示例输出: 2 3 5 4 10 3 20 3 100 2

3 个答案:

答案 0 :(得分:1)

正如@ Component10所提到的,你的数组是固定大小的。添加一个名为count的整数,每次从输入中弹出一个新数字时,该整数都会递增。将所有对8的整数文字引用更改为counter

答案 1 :(得分:1)

UPDATE(由于某些原因似乎无法发表评论):我通过使x变长并使用循环初始化来修复此问题。现在没有运行时错误,但显然需要花费太多时间。关于如何减少时间的任何想法都会非常感激!

更新代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

struct count {
    int number;
    int repetitions;
};

bool sortByNumber(const struct count &lhs, const struct count &rhs) { 
    return lhs.number < rhs.number;
}

int main() {
    vector <int> input;
    int n = 0;
    do {
        cin>>n;
        input.push_back(n);
    } while (n != 0);

    struct count x[input.size()];

    int u = 0;

    do {
        x[u].number = 0;
        x[u].repetitions = 0;
        u++;
    }  while ((x[u].number != 0) && (x[u].repetitions != 0));

    for (int j = 0; j < input.size(); j++) {
        int tracker = 0;
        for (int z = 0; z < input.size(); z++) {
            if (input[j] != x[z].number) {
                tracker++;
            }
        }
        if (tracker == input.size()) {
            x[j].number = input[j];
        }
    }

    sort(x, x+input.size(), sortByNumber);

    int structSize = sizeof(x) / sizeof(x[0]);

    for (int y = 0; y < structSize; y++) {
        for (int w = 0; w < input.size(); w++) {
            if (x[y].number == input[w]) {
                x[y].repetitions++;
            }
        }
    }


    for (int v = 0; v < structSize; v++) {
        if ((x[v].number > 0) && (x[v].repetitions > 0)) {
            cout << x[v].number << " " << x[v].repetitions << endl;
        }
    }

    return 0;
}

答案 2 :(得分:0)

如果input包含的元素超过101个,那么条件

if (tracker == 8) {
    x[j].number = input[j];
}

if (input[j] != x[z].number) {
    tracker++;
}

由于数组j元素的越界访问,正在为超过100的任何x值调用未定义的行为。 zj都会循环到input.size(),可以高于101。

未定义的行为可以通过多种方式表现出来。运行时错误是其中一种可能性。