C程序检查彩票号码:为什么有些测试失败?

时间:2017-04-26 16:44:24

标签: c algorithm sorting vector

该程序将以下几行作为输入:

23 12 33 19 10 8
5
23 19 8 12 60 18
14 60 12 44 54 10
8 3 12 19 33 10
33 15 7 60 12 10
22 12 19 23 33 11

23 12 33 19 10 8(第一行)是彩票结果。 n(在这个特定情况下,5)通知下面将有多少行。

每行有6个数字。数字顺序无关紧要。

规则是:数字范围从1到60(包括1和60),它们永远不会在同一行中重复。

变量“quadra”存储有多少行有4个数字正确。

变量“quina”存储了多少行有5个数字。

变量“sena”存储有多少行有6个数字正确。

所以,一个计算机程序正在对我的代码运行一些测试,它声称大多数都出错了,但我看不出这里有什么问题。有人有线索吗?这个代码是错误的,或者测试此代码的软件是否有问题?

#include <stdio.h>

int main(){
    int mega[6];
    int v[50500][6];
    int n,swap; 
    int i,j,k; //counters
    int quadra,quina,sena;
    quadra = 0;
    quina = 0;
    sena = 0;
    for(i=0;i<6;++i) scanf("%i",&mega[i]); //first line, lottery results
    scanf("%i",&n);
    for(i=0;i<n;++i){
        for(j=0;j<6;++j){
            scanf("%i",&v[i][j]);
        }
    }
    for(i=0;i<n;++i){
        for(j=0;j<6;++j){
            for(k=0;k<6;++k){
                if(v[i][j] == mega[k]){
                    v[i][j] = 61;
                }
            }
        }
    }

    //reverse bubble sort
    for(i=0;i<n;++i){
        for(j=0;j<6;++j){
            for(k=j+1;k<6;++k){
                if(v[i][j] < v[i][k]){
                    swap = v[i][k];
                    v[i][k] = v[i][j];
                    v[i][j] = swap;
                }
            }
        }
    }

    for(i=0;i<n;++i){
        for(j=0;v[i][j] == 61 && j<6;++j);
        if(j == 4) ++quadra;
        else if(j == 5) ++quina;
        else if(j == 6) ++sena;
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

是的,您的代码存在一些值得注意的问题:

编译时间表示未初始化变量的可能性:

enter image description here

但是, 运行时 会导致未知源位置的致命运行时间。 堆栈溢出。这可能是由于这一行:

int v[50500][6]; 

增加堆栈大小。单独v需要大约2.5Mbytes。

此外,这一行可能不是你想要的:

for(i=0;i<6;++i) scanf("%i",&mega[i]); //first line, lottery results
                                     ^

如果您打算循环其余代码,请在;语句后删除for(),并使用大括号:

for(i=0;i<6;++i) scanf("%i",&mega[i]) //first line, lottery results
{
    scanf("%i",&n);
    ....

答案 1 :(得分:1)

你的代码是真的,我理解并尝试了它的流程。看起来很好,但是如果你不需要对每一行进行排序(并在这个循环for(j=0;v[i][j] == 61 && j<6;++j);中使用j作为计数器),你可以使用更简单的if语句来比较真实的彩票结果和输入的结果。我的意思是你的算法有点复杂。尝试一个简单的,看看它是如何工作的。