用C语言打印位置数字系统

用C语言打印位置数字系统,c,printing,C,Printing,我正在尝试编写一个函数,用给定的基数和位数打印位置数字系统。例如,对于Base=2和nDigits=3,输出必须如下所示: 000 001 010 011 ... 111 现在,我试着做点什么,但是失败了。考虑到我不能存储这些数字,我只需要打印它们,这就是为什么我使用一个“支持”数组的动态分配。这就是我到目前为止试图做的,显然没有做它打算做的。。。我认为唯一正确的部分是打印所有基本字符的组合。(b=基准,n=ndigit) void打印计数(int b,int n){ int i,j=0; i

我正在尝试编写一个函数,用给定的基数和位数打印位置数字系统。例如,对于Base=2和nDigits=3,输出必须如下所示:

000
001
010
011
...
111
现在,我试着做点什么,但是失败了。考虑到我不能存储这些数字,我只需要打印它们,这就是为什么我使用一个“支持”数组的动态分配。这就是我到目前为止试图做的,显然没有做它打算做的。。。我认为唯一正确的部分是打印所有基本字符的组合。(b=基准,n=ndigit)

void打印计数(int b,int n){
int i,j=0;
int*array=calloc(n,sizeof(int));
if(数组==NULL){
printf(“分配失败。\n”);
出口(0);
}
对于(i=0;i
你说的话我80%都听不懂

这是一个糟糕的比率。让我解释一下:


在内部循环中增加每个数字

您可以无条件地递增内部循环中的每个数字,并在必要时将其换行。这意味着您的枚举将以lockstep递增所有数字,从而产生输出,如00、11、22、00、11、2、

您可以连续增加最后一个数字(并计算进位),直到第一个数字结束(想想里程表)

您可以从一个全零数组开始。打印它。增加最后一个数字。检查是否溢出,如果溢出,则将其设置为零并增加下一个数字,依此类推。如果最左边的数字溢出,则停止枚举。汽车里程表(英里/公里计数器)就是这样工作的:

void printnum(int dig[], int n)
{
    static const char *digit = "0123456789abcdefghijklmnopqrstuvwxyz";

    while (n--) putchar(digit[dig[n]]);
    putchar('\n');
}

int enumerate(int base, int n)
{
    int dig[100] = {0};
    int count = 0;

    for (;;) {
        int i = 0;

        while (i < n && dig[i] == base) {
            dig[i++] = 0;
            dig[i]++;
        }
        if (i == n) break;

        printnum(dig, n);

        dig[0]++;
        count++;
    }

    return count;
}
有更多的方法来解决这个问题。几个小时的乐趣

你说的话我80%都听不懂

这是一个糟糕的比率。让我解释一下:


在内部循环中增加每个数字

您可以无条件地递增内部循环中的每个数字,并在必要时将其换行。这意味着您的枚举将以lockstep递增所有数字,从而产生输出,如00、11、22、00、11、2、

您可以连续增加最后一个数字(并计算进位),直到第一个数字结束(想想里程表)

您可以从一个全零数组开始。打印它。增加最后一个数字。检查是否溢出,如果溢出,则将其设置为零并增加下一个数字,依此类推。如果最左边的数字溢出,则停止枚举。汽车里程表(英里/公里计数器)就是这样工作的:

void printnum(int dig[], int n)
{
    static const char *digit = "0123456789abcdefghijklmnopqrstuvwxyz";

    while (n--) putchar(digit[dig[n]]);
    putchar('\n');
}

int enumerate(int base, int n)
{
    int dig[100] = {0};
    int count = 0;

    for (;;) {
        int i = 0;

        while (i < n && dig[i] == base) {
            dig[i++] = 0;
            dig[i]++;
        }
        if (i == n) break;

        printnum(dig, n);

        dig[0]++;
        count++;
    }

    return count;
}

解决这个问题的方法还有很多。

首先,不要对整数使用
pow
至少不能不舍入。
pow
使用不精确的浮点算法进行求幂运算。就在上周,有一个问题出现了错误,因为

也就是说,可能存在一个平台,其中
pow(2,3)
如您的示例中所示,结果为
7.999999…
;由于只需截断小数即可将double转换为整数,这意味着您的代码将运行7个循环而不是8个循环!对于
double
比较,同样的情况仍然存在;8.0仍然大于7.999999999。因此,我们使用r被正确舍入到最接近的整数值(本例中为8.0)

此外,您还需要预先计算这个数字,而不是每次循环迭代

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

最后,记住释放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);
}
void打印计数(int b,int n){
int*digits=calloc(sizeof(int),n);
int max=圆形(功率(b,n));
对于(int i=0;i
首先,不要对整数使用
pow
至少不能不舍入。
pow
使用不精确的浮点算法进行求幂运算。就在上周,有一个问题出现了错误,因为

也就是说,可能存在一个平台,其中
pow(2,3)
如您的示例中所示,结果为
7.999999…
;由于只需截断小数即可将double转换为整数,这意味着您的代码将运行7个循环而不是8个循环!对于
double
比较,同样的情况仍然存在;8.0仍然大于7.999999999。因此,我们使用r被正确舍入到最接近的整数值(本例中为8.0)

此外,您还需要预先计算这个数字,而不是每次循环迭代

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

最后,记住释放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);
}
void打印计数(int b,int n){
int*digits=calloc(sizeof(int),n);
int max=圆形(功率(b,n));
对于(int i=0;i
你的问题是什么?你可以增加内环中的每个数字。你可以连续增加最后一个数字(并计算进位),直到第一个数字结束(想想里程表),或者你可以用常用的代码打印
i
,打印int