在C语言中打印列

3
有类似的问题,但没有帮助我找到我要的答案,所以我来寻求帮助!
同时,这是一份作业,所以我更希望得到解释而不仅仅是可用代码。
我需要打印两列或四列输出来显示1-20的阶乘。
我很接近了,只是似乎无法弄清楚如何使这两个部分并排。
代码:
lngFactorial = 1;

// Factorials 1 - 10
for (intIndex = 1; intIndex <=10; intIndex += 1)
{

    lngFactorial *= intIndex;
    printf("%d! = %-20lu \n", intIndex, lngFactorial );
}

// Factorials 11 - 20
for (intIndex = 11; intIndex <= 20; intIndex += 1)
{
    lngFactorial *= intIndex;
    printf("%20d ! = %lu \n", intIndex, lngFactorial);
}

输出:

1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
              11 ! = 39916800
              12 ! = 479001600
              13 ! = 1932053504
              14 ! = 1278945280
              15 ! = 2004310016
              16 ! = 2004189184
              17 ! = 4006445056
              18 ! = 3396534272
              19 ! = 109641728
              20 ! = 2192834560

那么,这是4列,我需要想办法打印出来。

1! = 1    11! = 39961800

我在printf中有什么错过了吗?

非常感谢任何指导。


3
您需要同时打印第1列和第11列。 - ringbuffer_peek
3
“13!”不等于“1932053504”。 - Stargateur
1
@Stargateur - 对我来说看起来像是整数溢出。13! == 0x17328CC00。而 x7328CC00 == 1932053504。OP 需要在所有计算中从 int 切换到 long long,并使用 %ll 作为 printf 的格式参数,而不是 %d - selbie
啊,好的,我会将它从unsigned long改为unsigned long long,谢谢你!你能详细解释一下“13! == 0x17328CC00. Whereas x7328CC00 == 1932053504”是什么意思吗? - user3691838
@user3691838 - 13! 的值为 6227020800(十进制)。在十六进制中,它写成了 9 个十六进制数字:17328CC00,其中每个数字代表 4 位。因此,32 位数字不能超过 8 个十六进制数字。所以当发生溢出时,结果会被计算为 overflow % 2^32,这相当于从那个 9 位十六进制字符串中删除前导数字。 - selbie
4个回答

5

将列一起打印,类似于:

// Using long long to allow big numbers and to prevent overflow.
unsigned long long lngFactorial1 = 1;
unsigned long long lngFactorial2 = 3628800;// 10!
for (intIndex = 1; intIndex <= 10; intIndex++) {
    lngFactorial1 *= intIndex;
    lngFactorial2 *= intIndex + 10;
    printf("%d! = %-20llu ; %d! = %-20llu;\n", intIndex, lngFactorial1, intIndex + 10, lngFactorial2);
}

这个。我没有想到要用输出值10来初始化第二个阶乘。谢谢! - user3691838

2

一旦您使用换行符,您将无法返回到上一行(除非更改该行)。

如果您需要在同一行中打印1!和11!,则必须在一行中打印它们,然后换行。 因此,对于特定的迭代i和(10 + i)阶乘将被打印。(1<=i<=10)。

另外,为了存储大于12的阶乘,您需要长数据类型。


1
换行符并不是一个“运算符”,它只是一个字符。我认为称其为运算符有点令人困惑。 - unwind

1
对于这个问题,您需要使printf的格式类似于以下内容。
printf("%d! = %-20lu "%20d ! = %lu", intIndex, lngFactorialn, (intIndex + 10), lngFactorialn);

所以你需要先计算它们,然后同时打印出来。我认为这只需要一个for循环就可以解决。


你需要创建两个变量来计算阶乘,因为当前的阶乘值依赖于前一个值。 - ringbuffer_peek
我认为这是解决方案,因为for循环从1到10,第二个从11到20,他需要将它们放在一行中,并且考虑到这是作业,老师认为学生应该自己想到这一点。 - Ervin Cosic
但是看看你的值。第11个值取决于上一个循环中第10个值的取值。这意味着你的输出结果是错误的。 - ringbuffer_peek
这就是我所缺少的,我一直在尝试类似于这样的东西,弄清楚是否所有内容都需要在一行上,但我一直得到错误的结果。 - user3691838
@user3691838,你没有检查我的答案吗? - ringbuffer_peek
@tilz0R 你说得对,我是凭想象写的,没有好好考虑。 - Ervin Cosic

0

正如其他答案所述,您必须同时计算每列中的相同行。 这是我的解决方案,适用于各种列数:

#include <stdio.h>
#include <string.h>

void factorial_in_columns(int col_num, int width, int max_fact) {
    int col_width = width / col_num; /* the width of a column */
    int fact_offset = max_fact / col_num; /* calculation distance */

    char col_buffer[col_width]; /* buffer of a column */
    char line_buffer[width + 1]; /* buffer of a line */

    long factorial;
    int i, j, k, x, len;

    for(i = 1; i <= fact_offset; ++i) {
        for(j = 0; j < col_num; ++j) {
            x = (i + (j * fact_offset)); /* current number */

            for(factorial = 1, k = 1; k <= x; ++k)
                factorial *= k;

            /* convert the result to string and append it to the line buffer */
            snprintf(col_buffer, col_width, "%d = %ld", x, factorial);
            sprintf(line_buffer + (col_width * j), "%-*s", col_width, col_buffer);
        }            
        printf("%s\n", line_buffer);
    }
}

int main() {
    factorial_in_columns(4, 120, 20);
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接