检查二维矩阵中的重复数字并将数据包含在两个变量中

Checking for duplicate numbers in a 2D matrix and containing the data into two variables

我正在尝试检查 2D 矩阵数组中每一行的正确数字和附加值,然后在每次正确时只打印一次 number/extra。

即如果 34 在累积奖金中两次,在矩阵行中一次,它应该只记录一次。

正确号码为头奖数组的前7个号码,额外号码为最后3个号码。

谁能解释为什么第 2 行的第 1 行从我当前的输出中删除了?

我猜是因为previous[]中已经记录了正确的数字34,然后将其与多余的34进行比较,因此extra减去1。

如何解决这个问题,我应该制作另一个数组来存储以前的额外内容吗?

正确输出:

Row 1 has 0 correct and 0 extras!
Row 2. has 1 correct and 1 extras!
Row 3. has 3 correct and 0 extras!
Row 4. had 1 correct and 1 extras!
Row 5. has 1 correct and 0 extras!

我当前的输出:

Row 1. has 0 correct and 0 extras! 
Row 2. has 1 correct and 0 extras! 
Row 3. has 3 correct and 0 extras!
Row 4. has 1 correct and 1 extras!
Row 5. has 1 correct and 0 extras!
for (int z = 0; z < NUM_PER_ROW; z++) 
{
    if (previous[z] == jackpot[k] && k <= 6) 
    {
        correct -=1;
        break;
    }
    else if (previous[z] == jackpot[k] && k > 6) 
    {
        extra -=1;
        break;
    }
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_ROWS 5
#define NUM_PER_ROW 7
#define MAX_NUM 40

int doStuff();

int doStuff() 
{
    int matrix[MAX_ROWS][NUM_PER_ROW] = { 
        { 1,  2,  3,  4,  5,  6,  7}, 
        {30, 38,  6, 34,  4, 39, 30},
        { 9, 37, 32, 27,  9, 39, 17}, 
        { 8, 26,  6, 31, 28, 29, 16}, 
        {33, 21, 19,  7,  9, 19, 30} };
    int jackpot[NUM_PER_ROW + 3] = 
        {20, 37, 22,  9, 34, 28, 34, 24, 26, 29};
    int num = 0, i, j, cnt = 0, temp = 0;

    for(i = 0; i < MAX_ROWS; i++) 
    {
        int correct = 0;
        int extra = 0;

        for(j = 0; j < NUM_PER_ROW; j++)
        {
            int previous[7] = {0, 0, 0, 0, 0, 0, 0};

            for (int k = 0; k < NUM_PER_ROW + 3; k++) 
            {
                if (matrix[i][j] == jackpot[k]) 
                {
                    for (int z = 0; z < NUM_PER_ROW; z++) 
                    {
                        if (previous[z] == jackpot[k] && k <= 6) 
                        {
                            correct -= 1;
                            break;
                        }
                        else if (previous[z] == jackpot[k] && k > 6) 
                        {
                            extra -=1;
                            break;
                        }
                    }
                    if (k <= 6) 
                    {                       
                        correct += 1;
                    } 
                    else 
                    {
                        extra += 1;

                    }

                    previous[j] = jackpot[k];
                }
            }
        }

        printf("Row %d. has %d correct and %d extras! \n", i + 1, correct, extra);
    }

    return 0;
}

int main()
{
    int num;
    srand(time(NULL));

    doStuff(num);

    return 0;
}

感谢您的宝贵时间!

我建议使用数组来标记 jackpot[] 中的重复项:

    char jp_dupe[NUM_PER_ROW + 3];

    for (i = 0; i < NUM_PER_ROW + 3; i++)
    {
        for (j = 0; j < i && jackpot[i] != jackpot[j]; j++)
            ;
        jp_dupe[i] = (i != j); /* 0 if first occurrence, 1 if a duplicate */
    }

那么就不需要previous[]数组,也不需要z循环,k循环可以简化:

            for (int k = 0; k < NUM_PER_ROW + 3; k++) 
            {
                if (!jp_dupe[k] && matrix[i][j] == jackpot[k]) 
                {
                    if (k < NUM_PER_ROW) 
                    {                       
                        correct += 1;
                    } 
                    else 
                    {
                        extra += 1;
                    }
                }
            }

我冒昧地替换了 <= 6 测试以避免幻数。幻数 3 也可以用宏代替。