显示二维数组中两边的总和

时间:2018-02-19 05:18:02

标签: c++

我在魔术广场中显示每行和每列的总和时遇到了困难。我的魔方算法很好但是当我试图显示每一方的总和时,它会弄乱我的魔方,它给了我大而负的值。我有一种预感,它与我的索引有关,我花了很长时间弄清楚为什么我无法正确显示它。任何帮助将不胜感激。

幻方是在nxn矩阵中从1到n ^ 2(n平方)的数字排列,每个数字恰好出现一次,并且任何行,任意列的条目总和,或任何主要对角线是相同的。不难证明这个总和必须是n(n ^ 2 + 1)/ 2。

解决这个地方1在广场的第一行中间然后为下一个数字向上移动然后向左移动,如果索引被占用则将其放置在1行中。

抱歉,我用英语解释它并不是那么好。谢谢

#include <iostream>

using namespace std;

int main(){

    int n,x,y;

    cout<<"Enter size of the magic square " <<endl;
    cout<<"Must be odd number starting from 3: ";
    cin>>n;
    while(n%2==0){              //condtion if the entered value is even
        cout<<"Please Enter Odd number: ";
        cin>>n;
    }
    cout<<"\n\n";

    int array[n][n];            //create 2d matrix

    for( x=0;x<n;x++){              //initialize the value of your 2d matrix as 0
        for( y=0;y<n;y++){
            array[x][y] = 0;        
        }   
    }



    int row = 0;            //your row starting position
    int col = n/2;          //your colum starting position

    array[row][col] =1;     //position of your first counting number 

    for (int i = 2; i <= n*n; ++i)      //this is working   algorith is up left
    {
        if((i-1)%n == 0)            //if it is occupied go down
        {
            row++;
        }
        else  
        {
            row--;               
            row = (row+n)%n;

            col -=1;
            col%=n-1;
        }
        if (col<0){
            col = col+n;
        }
        array[row][col] = i;


    }                               //up to here


    for(x=0;x<n;x++){               //display sum in the side
        for(y=0;y<n;y++){
            array[x][n]+=array[x][y];
        }
    }

    for(x=0;x<n;x++){               //display sum at the bottom
        for(y=0;y<n;y++){
            array[n][x]+=array[x][y];
        }
    }

    for(x=0;x<=n;x++){              //display your matrix.
        for(y=0;y<=n;y++){
            cout<<"\t" <<array[x][y]  <<"  ";   
        }
        cout<<"\n\n";
    }

}

1 个答案:

答案 0 :(得分:2)

使用

int array[n][n];            //create 2d matrix
仅在某些平台上支持

作为扩展。我强烈建议将其更改为使用std::vector

std::vector<std::vector<int>> array;

另外,您使用:

        array[n][x]+=array[x][y];

        array[x][n]+=array[x][y];

由于n不是有效索引,因此这些行会导致未定义的行为。

此外,在这两种情况下,您都在累积行中的值。第二行需要累积列中的值。您需要使用array[y][x]

您希望将行的总和和列的总和显示为最终输出以及2D数组的元素。为此,创建n+1 X n+1矩阵会更容易。你可以使用:

来做到这一点
std::vector<std::vector<int>> array(n+1, std::vector<int>(n+1));

计算行总和并将它们存储在n+1列中的逻辑需要是:

for(x=0;x<n;x++){
   array[x][n] = 0;
   for(y=0;y<n;y++){
     array[x][n] += array[x][y];
   }
}

计算列总和并将其存储在n+1行中的逻辑需要是:

for(x=0;x<n;x++){
  array[n][x] = 0;
  for(y=0;y<n;y++){
     array[n][x] += array[y][x];
  }
}

https://ideone.com/XBzUr0处查看它。