如何以特定的三角形打印阵列?

时间:2018-05-11 06:55:17

标签: c arrays

我有一个包含十个元素{a, b, c, d, e, f, g, h, i, j}的数组。我想像这样打印出来:

a  
b e
c f h
d g i j

请注意,第一列包含数组的前四个值。第二列(从第二行开始)由数组的下三个值组成,依此类推。

我的代码如下:

#include <stdio.h>

#define size 10

int main() {
  int arr[size] = {14, 22, 34, 57, 44, 42, 33, 55, 48, 47};
  int i, j, n, c, maxTemp;
  n = 4;
  maxTemp = 1;
  c = n - 1;

  for (i = 0; i < n; i++) {
    for (j = i; j < maxTemp; j = j + c) {
      printf("%d ", arr[j]);
    }
    if (maxTemp <= size) {
      maxTemp = maxTemp + c + 1;
    }
    printf("\n");
  }
  return 0;
}

对于数组

int arr[size] = {14, 22, 34, 57, 44, 42, 33, 55, 48, 47};

我期待

14  
22 44   
34 42 55  
57 33 48 47  

但得到了:

14  
22 44  
34 42 48   
57 33 47 13  

这可能发生了这种情况,因为变量c值没有减少 因为我希望将c的值减一。我已经尝试但无法弄清楚。

1 个答案:

答案 0 :(得分:5)

让我们看看你想要的索引,它们是

0
1 4
2 5 7
3 6 8 9

用线性数字填充空格(我们以后不打印)

0 (3  5  6)
1  4 (6  7)
2  5  7 (8)
3  6  8  9

索引,根据所需的模式通过列上升 这给出了i的线性关系,即索引将被计算为i + ...部分。

每列(包括“()”内的填充值)的值高于上一列中的最后一个数字,或多或少高于n
但是从较低的位置开始(即使用前一列中的某些值),以便匹配第一个空(已填充)行 这给出了j*n的线性关系,即会有... + j*n

让我们试试,这里的索引为i+j*n

0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15

这些太高了,每一行都是0,1,3,6 例如。看最后一排
3-0==3 7-1==6 11-3==8 15-6==9

那是j*(j+1)/2 顺便说一下,我自己也没有找到这个,所以我用我最喜欢的搜索引擎来搜索字面上的“0,1,3,6”;这突然出现了:
https://www.mathsisfun.com/algebra/triangular-numbers.html

将它放在一起,正确的索引是:

i+j*n - j*(j+1)/2 

在代码中:

#include<stdio.h>
#define size 10

int main(void) {
  int arr[size] = {14, 22, 34, 57, 44, 42, 33, 55, 48, 47};
  int i, j, n=4;
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < i+1; j++)
    {
      printf("%d ", i+j*n - j*(j+1)/2 );
    }
    printf("\n");
  }
  return 0;
}

输出:

0
1 4
2 5 7
3 6 8 9