我有一个包含十个元素{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
的值减一。我已经尝试但无法弄清楚。
答案 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