tags:

views:

74

answers:

3

This function prints every number starting from 0000 to 1000.

#include <stdio.h>

int main() {
    int i = 0;
    while ( i <= 1000 ) {
        printf( "%04d\n", i);
        i = i + 1; 
    }
    return 0;
}

The output looks like this:

0000
0001
0002
etc..

How can I make this more presentable using three different columns (perhaps using \t ) to have the output look like this:

0000 0001 0002
0003 0004 0005
etc..

+4  A: 

To get 3 columns you need to print new line character only after each 3 numbers (in your case after a number if its remainder when divided by 3 is 2):

The simplest approach:

while ( i <= 1000 ) {
    if (i%3 == 2)
       printf( "%04d\n", i);
    else
       printf( "%04d ", i);
    i = i + 1; 
}

Or as pointed in comment you can make it shorter using ternary operator:

while ( i <= 1000 ) {
   printf("%04d%c", i, i%3==2 ? '\n' : ' ');
   ++i; 
}
Vladimir
Simpler is `printf("%04d%c", i, i%3==2 ? '\n' : ' ');`
R..
Elegant and easy to understand, thank you.
roybot
+5  A: 

This is how I'd do it, to eliminate the potentially expensive if/?: statement:

char nl[3] = {' ', ' ', '\n'};
while ( i <= 1000 ) {
   printf("%04d%c", i, nl[i%3]);
   ++i; 
}

Note that the modulo division may be much more expensive than the branching anyhow, but this depends on your architecture.

ysap
Exactly what I'm thinking...;)
Nyan
I would do `i % (sizeof(nl)/sizeof(*nl))` so that you only have to change one line if you want to change the number of columns.
asveikau
A: 
while ( i <= 1000 )
{
   printf( i%3?"%04d ":"%04d\n", i );
   ++i;
}

should also works.