首页 > 解决方案 > 如何以特定的三角形打印数组?

问题描述

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

一种  
是
cfh
dgij

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

我的代码如下

#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' 值减少一。我试过但无法弄清楚。

标签: carrays

解决方案


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

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

推荐阅读