printf精度控制问题

时间:2014-10-26 05:48:12

标签: c

我需要在C中打印出一个如下所示的乘法表:

   1  2  3  4  5  6  7  8  9 10
1  1  2  3  4  5  6  7  8  9 10
2     4  6  8 10 12 14 16 18 20
3        9 12 15 18 21 24 27 30
4          16 20 24 28 32 36 40
5             25 30 35 40 45 50
6                36 42 48 54 60
7                   49 56 63 70
8                      64 72 80
9                         81 90
10                          100

我的循环以正确的格式打印数字现在有点乏味:

printf("   1   2   3   4   5   6   7   8   9  10\n");
for(i=1; i<=10; i++)
{
    printf("%4d", i);
    for (j=i; j<=10; j++)
    {           
        result = i*j;
        if (i == 2 && j == 2)
        {
            printf("%8d", result);    
        }
        else if (i == 3 && j == 3)
        {
            printf("%12d", result);                
        }
        else if (i == 4 && j == 4)
        {
            printf("%16d", result);    
        }
        else if (i == 5 && j == 5)
        {
            printf("%20d", result);    
        }
        else if (i == 6 && j == 6)
        {
            printf("%24d", result);                
        }
        else if (i == 7 && j == 7)
        {
            printf("%28d", result);    
        }
        else if (i == 8 && j == 8)
        {
            printf("%32d", result);
        }
        else if (i == 9 && j == 9)
        {
            printf("%36d", result);
        }    
        else if (i == 10 && j == 10)
        {
            printf("%40d", result);
        }
        else
        {
            printf("%4d", result); 
        }
    }
    printf("\n");
}

我在想是必须有一种方法可以使这更容易,以某种方式将int变量连接到数字的精度,如下所示:

if (i == j)
{
    printf("%(4 * i)d", result);
}
else
{
    printf("%4d", result);
}

这段代码显然不会起作用,但有没有办法可以实现这样的东西,所以我可以避免当前循环中的所有if / else语句?

2 个答案:

答案 0 :(得分:3)

这可能不是您想要的,但它可以帮助您:

#include <stdio.h>

int main() {
    int i, j, result;
    printf("          1   2   3   4   5   6   7   8   9  10\n");
    for(i=1; i<=10; i++) {
        printf("%3d %*s", i, i * 4, " ");
        for (j=i; j<=10; j++) {
            printf("%3d ", i * j); 
        }
        printf("\n");
    }   
    return 0;
}

输出:

          1   2   3   4   5   6   7   8   9  10
  1       1   2   3   4   5   6   7   8   9  10 
  2           4   6   8  10  12  14  16  18  20 
  3               9  12  15  18  21  24  27  30 
  4                  16  20  24  28  32  36  40 
  5                      25  30  35  40  45  50 
  6                          36  42  48  54  60 
  7                              49  56  63  70 
  8                                  64  72  80 
  9                                      81  90 
 10                                         100 

答案 1 :(得分:0)

以下代码几乎实现了您所需的输出:

#include <stdio.h>

int main(void)
{
    printf("%4s", " ");
    for (int i = 1; i <= 10; i++)
        printf("%4d", i);
    putchar('\n');

    for (int i = 1; i <= 10; i++)
    {
        printf("%-*d", 4 * i, i);
        for (int j = i; j <= 10; j++)
            printf("%4d", i * j);
        putchar('\n');
    }

    return 0;
}

输出:

       1   2   3   4   5   6   7   8   9  10
1      1   2   3   4   5   6   7   8   9  10
2          4   6   8  10  12  14  16  18  20
3              9  12  15  18  21  24  27  30
4                 16  20  24  28  32  36  40
5                     25  30  35  40  45  50
6                         36  42  48  54  60
7                             49  56  63  70
8                                 64  72  80
9                                     81  90
10                                       100

不同之处在于线条起点处的空间。您想要的输出有2个空格用于行号,后面跟着2个空格用于标记为1的行中的1,后面跟着每个其他条目有4个空格。模仿那确实是一个有点繁琐 - 可行,但很繁琐:

#include <stdio.h>

int main(void)
{
    for (int i = 1; i <= 10; i++)
        printf("%4d", i);
    putchar('\n');

    for (int i = 1; i <= 10; i++)
    {
        printf("%-*d", 4 * i - ((i == 1) ? 2 : 4), i);
        for (int j = i; j <= 10; j++)
            printf("%*d", (j == 1) ? 2 : 4, i * j);
        putchar('\n');
    }

    return 0;
}

条件表达式不是很优雅。