用C将数组变成类似直方图的输出
Friday, 17 June 2011
比如一个数组[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的乘积仍然是那几个数字的排练组合。