该程序将以下几行作为输入:
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;
}
答案 0 :(得分:1)
是的,您的代码存在一些值得注意的问题:
编译时间表示未初始化变量的可能性:
但是, 运行时 会导致未知源位置的致命运行时间。 堆栈溢出。这可能是由于这一行:
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
语句来比较真实的彩票结果和输入的结果。我的意思是你的算法有点复杂。尝试一个简单的,看看它是如何工作的。