c - 在 C 中打印位置数字系统

标签 c printing

我正在尝试编写一个函数来打印具有给定基数和位数的位置数字系统。例如,当 Base = 2 和 nDigits = 3 时,输出必须是这样的:

000
001
010
011
...
111

现在,我尝试做一些事情,但我只是失败了。考虑到我无法存储数字,我只需要打印它们,这就是我使用“支持”数组的动态分配的原因。到目前为止,这就是我尝试做的,显然没有按照预期的方式去做......我认为唯一正确的部分是打印 Base^nDigits 的所有组合。 (b=base, n=nDigits).

void printNumeration(int b, int n){
    int i, j=0;
    int *array = calloc(n, sizeof(int));

    if (array == NULL){
        printf("Allocation failed.\n");
        exit(0);
    }


    for (i=0; i<pow(b, n); i++){
        for (j=0; j<n; j++){
            printf("%d", array[j]);
            array[j]++;
            if (array[j] == n){
                array[j] = 0;
            }
        }
        printf("\n");
    }
}

如果我的完全错误,您还可以提供一些关于更好解决方案的提示。

最佳答案

首先,不要对整数使用 pow - 至少不能不进行四舍五入pow 使用不精确的浮点算法进行取幂。就在上周有一个问题因为pow(10, 2) was 99.9999999... which truncated to int was 99而出错。 .

也就是说,很可能有一个平台,其中 pow(2, 3) 如您的示例所示,结果为 7.999999...;由于仅通过截断小数将 double 转换为整数,这意味着您的代码运行 7 个循环而不是 8 个循环! double 比较也是如此; 8.0 仍然大于 7.999999999999999。因此我们使用 round以确保将结果数字正确舍入为最接近的整数值(在本例中为 8.0)。

此外,您还需要事先计算这个数字,而不是针对每个循环迭代。

我们有 2 个内部循环。首先打印数字,然后向后工作 - 如果第 k 位等于 b,我们将其设置为 0,我们将 k 减 1,现在增加 k 第一个数字,然后重复。

最后,记得释放calloc分配的内存。

void printNumeration(int b, int n) {
    int *digits = calloc(sizeof(int), n);
    int max = round(pow(b, n));
    for (int i = 0; i < max; i ++) {
        for (int j = 0; j < n; j ++) {
            printf("%d", digits[j]);
        }
        int k = n - 1;
        digits[k] ++;
        while (k && digits[k] == b) {
            digits[k] = 0;
            k--;
            digits[k] ++;
        }
        printf("\n");
    }
    free(digits);
}

关于c - 在 C 中打印位置数字系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957162/

相关文章:

c - union 无法解码字节数组

html - 打印 - chrome 中缺少页眉和页脚 + 未对齐的自定义页脚

html - 图片卡在第 2 页 - CSS 打印

python - 使用 python 打印彩色字符串到控制台

java - 如何编写 Java 代码来打印使用 iText 创建的 PDF

html - @media 打印 XS 和 SM 屏幕尺寸的问题

c - 如何使用 read() 重新创建 receive() ?

c - 从函数返回 C 字符串

C:当值任意大时将字符串转换为数字

C 文本解析器无法识别单词