Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在三角形矩阵中求位置_C++ - Fatal编程技术网

C++ 在三角形矩阵中求位置

C++ 在三角形矩阵中求位置,c++,C++,我有对称矩阵存储在列主要的方式。但为了节省空间,我只存储矩阵的较低部分 我的矩阵是这样的: 我必须编写代码,根据该矩阵的索引I(行)、j(列),找到元素在该矩阵中的位置 我写过这样的东西: pos=(n*j)-j*j/2+(i-j) pos-矩阵中我的元素的位置-a[pos] 矩阵的n-尺寸 不幸的是,它并不总是找到好位置。 我编写程序对其进行测试,并打印: 1 2 6 3 7 11 4 8 12 14 5 9 13 15 17 6 10 14 16 18 18 我知道它是这样发生

我有对称矩阵存储在列主要的方式。但为了节省空间,我只存储矩阵的较低部分

我的矩阵是这样的:



我必须编写代码,根据该矩阵的索引I(行)、j(列),找到元素在该矩阵中的位置

我写过这样的东西:

pos=(n*j)-j*j/2+(i-j)

pos-矩阵中我的元素的位置-a[pos] 矩阵的n-尺寸

不幸的是,它并不总是找到好位置。 我编写程序对其进行测试,并打印:

1
2 6 
3 7  11
4 8  12 14
5 9  13 15 17
6 10 14 16 18 18
我知道它是这样发生的,因为当我们除以j*j/2时,我们得到int/int,但我不知道如何使它正确工作


请帮忙

首先,逐行存储矩阵(数组开头的第一行)以计算索引要简单得多

你的公式似乎错了,我想说是(对于j>0):

n+(n-1)+…+(n-j+1)+(i-j)

=((求和[0让我们一次检查一列计算,假设:

i <= j
1 <= i <= n
1 <= j <= n:
我们可以由此推导出一个一般公式:

p=n*(i-1)+j-(i-1)*i/2
可以使用一个简单的位a C来测试:

使用系统;
使用System.IO;
名称空间流
{
班级计划
{
静态void Main(字符串[]参数)
{
对于(int j=1;j
#包括
使用名称空间std;
int main()
{
int i=0,k=1,j=0;
INTA[5][5];
int n=0;

对于(j=0;jif是家庭作业添加家庭作业标记您似乎打印出的行比实际多!您能显示代码吗。@Pelsono:您是否使用1D数组存储矩阵?以及,
pos-我的元素在矩阵中的位置-a[pos]n-矩阵的大小
?条目“2”的
i,j
值是多少我把它留给了练习,让它去移植C++——现在不想让生活变得太简单了,是吗?Youp,它让我想起上次我的答案被否决的时候,写在C,而不是C++中。
i <= j
1 <= i <= n
1 <= j <= n:
i=1, pos=j
i=2, pos=n+j-1
i=3, pos=n+n-1+j-2
i=4, pos=n+n-1+n-2+j-3
etc...
p=n*(i-1)+j-(i-1)*i/2
using System;
using System.IO;

namespace Stream
{
  class Program
  {
    static void Main (string [] args)
    {
      for (int j = 1 ; j <= 5 ; ++j)
      {
        for (int i = 1 ; i <= 5 ; ++i)
        {
          Console.Write (GetIndex (i, j).ToString ("00 "));
        }
        Console.WriteLine ("");
      }
    }

    static int GetIndex (int in_i, int in_j)
    {
      int
        n = 5,
        i = Math.Min (in_i, in_j),
        j = Math.Max (in_i, in_j);


      return n * (i - 1) + j - (i - 1) * i / 2;
    }
  }
}
#include <iostream>
using namespace std;

int main()
{
    int i=0,k=1,j=0;
    int a[5][5];
    int n=0;

        for (j=0; j<5;j++)
        {
           for (i=n; i<5;i++)
            {
                a[i][j]=k++;
                cout<<i<<" "<<j<<" "<<(a[i][j])<<'\n';
            }
          n++;
        }

    return 0;
}