用C将数组变成类似直方图的输出

比如一个数组[4,6,7]可以输出成:

0 0 1
0 1 1
0 1 1
1 1 1
1 1 1
1 1 1
1 1 1

连续的1可以被看作一个直方。

基本思路:将输出看作一个矩阵,矩阵的大小是由原数组的长度N和数组中最大的数字M决定。左上角的坐标是(0,0),右下角的是(N,M)。则原问题被转化为,如何将原来的一维数组转化为这样一个二维数组,二位数组的每一个元素对应相应的坐标打印出来的数字是0还是1。以直方图的第一列为例,新的二维数组是a[M][N], 那么a[*][0]这一列则应该是0,0,0,1,1,1,1。具体代码如下:

#include <stdio.h>

void main(){
    int array_origin[4] = {4,6,10,9};
    int array_print[10][4] = {{0}};
    int i, j;
    for (i=0; i<4; i++){
        for (j=0;j<array_origin[i];j++){
            array_print[9-j][i] = 1;
        }
    }
    for (i=0; i<10; i++){
        for (j=0; j<4; j++){
            printf("%d ", array_print[i][j]);
        }
        printf("\n");
    }
}

另外一个有趣的小现象后面的故事:
大家可以尝试一下,142,857这个数与2、3、4、5、6相乘的6个不同结果,全是由“1”,“2”,“4”,“5”,“7”,“8”这六个数排列组合而成的。

这是为什么呢?

原因在于1/7的结果的是0.142857142857…..无限循环,之所以能这样循环,是因为1除以7的展开式里,商为1的时候余3,商为4的时候余2,……,一直到商为7的时候余1,余1的时候开始循环。因为一个数除以7只能有6个余数,所以这个无限寻婚小数的周期是6。

那142,857和7的余数相乘的结果的奥秘也就不难看出了,1除以7的余数是3、2、6、4、5、1,导致的商是1、4、2、8、5、7,那么如果是2除以7,则是把上面的余数的循环变成了从4开始,商的循环变成了从2开始,但是商的循环中的那几个数还是不变的。2/7 = 2 * (1/7),也就等于2*0.142857  循环,组成循环的数字不会变。同理,142857与3,4,5,6的乘积仍然是那几个数字的排练组合。