有困难的方法(使用 5 个不同的变量),也有简单的方法(使用缓冲区和三个变量)。
这具有“嵌套循环”并向上和向下计数,并适当缩进。
#include <stdio.h>
int main() {
char buf[ 128 ], *at;
int r, i;
int lftBlnk = 32;
for( r = 1; r <= 256; r *= 2 ) {
at = buf;
for( i = 1; i <= r; i *= 2 ) // ascending
at += sprintf( at, "%-4d", i );
for( i /= 4; i; i /= 2 ) // descending
at += sprintf( at, "%-4d", i );
printf( "%*s%s
", lftBlnk, "", buf ); // indent & output
lftBlnk -= 4;
}
return 0;
}
输出
1
1 2 1
1 2 4 2 1
1 2 4 8 4 2 1
1 2 4 8 16 8 4 2 1
1 2 4 8 16 32 16 8 4 2 1
1 2 4 8 16 32 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 256 128 64 32 16 8 4 2 1
编辑:
找点乐子,去掉不必要的东西,代码会变得非常紧凑。
int main() {
for( int lftBlnk = 32, r = 1; r <= 256; r *= 2, lftBlnk -= 4 ) {
printf( "%*s", lftBlnk, "");
int i;
for( i = 1; i <= r; i *= 2 ) printf( "%-4d", i );
for( i /= 4; i; i /= 2 ) printf( "%-4d", i );
putchar( '
' );
}
return 0;
}
事实上,让我们摆脱一个变量,添加另一个变量,并提高代码的灵活性(没有像“4”这样的重复常量和像 256 这样的幻数。)现在,指定编号。行数,并为每列留出足够的宽度...
int main() {
int rows = 11, wid = 5;
for( int r = 0; r < rows; r++ ) {
printf( "%*s", (rows-1-r)*wid, "");
int i;
for( i = 1; i <= (1 << r); i *= 2 ) printf( "%-*d", wid, i );
for( i /= 4; i; i /= 2 ) printf( "%-*d", wid, i );
putchar( '
' );
}
return 0;
}
1
1 2 1
1 2 4 2 1
1 2 4 8 4 2 1
1 2 4 8 16 8 4 2 1
1 2 4 8 16 32 16 8 4 2 1
1 2 4 8 16 32 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 256 128 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 256 512 256 128 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 256 512 1024 512 256 128 64 32 16 8 4 2 1