繁体   English   中英

C-解魔方

[英]C - Solving Magic Square

我正在尝试创建一个程序,该程序检查给定矩阵是否为幻方。 魔术正方形是每个序列的垂直,水平和对角线中所有数字的总和相同。 无论我输入的数字是什么,它总是将Magic Square返回为true。 编辑:固定对角线(kinda),除了它与对角线一起输出其他信息。

#include <stdio.h>
#include <stdlib.h>
//#include <stdbool.h>

int main() 
{
int nRows;
int nCols;
int sumR;
int sumC;
int sumD = 0;
int sumD2 = 0;
int k;
int p;
//bool isMagic = 1;


//Defining Matrix order
printf("Enter number of Rows: \n");
scanf("%i",&nRows);


printf("Enter number of Columns: \n");
scanf("%i",&nCols);

int matrix[nRows][nCols];
//int SumR[nRows];
//sint SumC[nCols];

//Enterring Coefficients of the Matrix
for(k = 0; k < nRows; ++k){
    for(p = 0; p < nCols; ++p){
        printf("Enter value for Matrix[%i][%i]: ",k,p);

        scanf("%i",&matrix[k][p]);
    }
}


//Adding diagonal elements
for(k = 0; k < nRows; ++k){
    //for(p = 0; p < nCols; ++p){
        //if(k == p ){
            sumD = sumD + matrix[k][k];
            sumD2 = sumD2 + matrix[k][nCols - k - 1];
            //sumD2 += matrix[k]
        //}
    //}
    printf("Sum of the Diagonals = %i\n",sumD);
    printf("Sum of the Diagonals2 = %i\n",sumD2);
    //sumD2 = 0;
    //sumD = 0;

}


//Adding the rows
for(k = 0; k < nRows; ++k){
    for(p = 0; p < nCols; ++p){
        sumR += matrix[k][p];
    }
    printf("Sum of the %i row is = %i\n",k,sumR);
    //if(sumR != sumC)
        //isMagic = 0;
    sumR = 0;
}

//Adding the columns
for(p = 0; p < nRows; ++p){
    for(k = 0; k < nCols; ++k){
        sumC += matrix[k][p];
    }
    printf("Sum of the %i column is = %i\n",p,sumC);
    //if(sumC != sumR)
        //isMagic = 0;
    sumC = 0;

}


//Displaying matrix
for(k = 0; k < nRows; ++k){
    for(p = 0; p < nCols; ++p){
    printf("%i\t",matrix[k][p]);
}
printf("\n");
} 



if(sumR == sumC == sumD == sumD2){
    printf("\nMagic Square!\n");
}
else{
    printf("\nNot a Magic Square!\n");
}


return 0;
//col[n]+row[n] == userinput

}

要设置sumRsumC在每个循环结束时为零。 计算后,它们的值均为零。 这就是为什么当您执行检查以查看它们是否相等时,总是返回true的原因。

在您打印这些值时,它们看起来正确,但是随后将其设置为零,并且您将丢弃该值,因此以后无法再次使用它! 您需要存储一个行总和数组和一个列总和数组,因此每一列和每一行都有一个总和。 只是int sumR sumR的Inrtead,使用类似int sumR [nCols];类的东西int sumR [nCols]; 对于sumC同样

做到这一点的最佳方法是假设它是一个魔幻矩阵。 定义一个新变量

int isMagic = 1;

您获得对角线的总和。 并加总。

然后,替换sumR = 0; 通过

if (sumR != sumD ) isMagic = 0;

并且sumC = 0; 通过

if (sumC != sumD ) isMagic = 0;

和魔术!

if( isMagic) {
    printf("\nMagic Square!\n");
}
else{
    printf("\nNot a Magic Square!\n");}

您的代码存在多个问题:

1-您在某个时候将值2进行了硬编码,而不是行和列的数量。

2- sumC和sumR在执行的最后设置为0

3-当您有多行和多列时,为什么会有一个SumR和一个SumC?

如果要存储总和或每列的每一列的总和,则需要SumR [nCols]和SumC [nRows]

好吧,正如@Javier Galan所建议的那样,我使用了isMagic方法来解决此问题。 这是完整的工作代码。

#include <stdio.h>

int main() 
{
int nRows;
int nCols;
int sumR;
int sumC;
int sumD = 0;
int sumD2 = 0;
int k;
int p;
int isMagic = 1;


//Defining Matrix order
printf("Enter number of Rows: \n");
scanf("%i",&nRows);


printf("Enter number of Columns: \n");
scanf("%i",&nCols);

int matrix[nRows][nCols];

//Enterring Coefficients of the Matrix
for(k = 0; k < nRows; ++k){
    for(p = 0; p < nCols; ++p){
        printf("Enter value for Matrix[%i][%i]: ",k,p);

        scanf("%i",&matrix[k][p]);
    }
}


//Adding diagonal elements
for(k = 0; k < nRows ; ++k){
        sumD += matrix[k][k];
        sumD2 += matrix[k][nCols - k - 1];
}
    printf("Sum of right Diagonal = %i\n",sumD);
    printf("Sum of left Diagonal = %i\n",sumD2);



//Adding the rows
for(k = 0; k < nRows; ++k){
    for(p = 0; p < nCols; ++p){
        sumR += matrix[k][p];
    }
    printf("Sum of the %i row is = %i\n",k,sumR);
        if(sumR != sumD && sumD2)
         isMagic = 0;
    sumR = 0;
}

//Adding the columns
for(p = 0; p < nRows; ++p){
    for(k = 0; k < nCols; ++k){
        sumC += matrix[k][p];
    }
    printf("Sum of the %i column is = %i\n",p,sumC);
        if(sumC != sumD && sumD2)
         isMagic = 0;
    sumC = 0;

}


//Displaying matrix
for(k = 0; k < nRows; ++k){
    for(p = 0; p < nCols; ++p){
    printf("%i\t",matrix[k][p]);
}
printf("\n");
}



if(isMagic){
    printf("\nMagic Square!\n");
}
else{
    printf("\nNot a Magic Square!\n");
}


return 0;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM