我怎样才能使用对数得到幂的相反数?

How can I use logarithms to get the opposite of power?

我在学校的数学一直不太好,我意识到我实际上需要 pow(base, exponent) 函数的反面,它可以通过某些因素对某个数字进行幂运算,例如 2 ^ 4 = 16

寻找答案我发现对数log()应该是幂的对数。 现在,我发现写例如"log 2 of 32" 在代码中看起来像 log(32) / log(2)...但是如何将以下问题转化为对数?

我将编写一个快速的 C 程序来打印索引 table,其中将打印分配给每个索引的所有字母字符 从 0 到 26 ^ DIGITS.

假设 DIGITS 设置为 1,table 的大小仅为 26(字母表从 A 到 Z 的长度),格式为 index[0] = A, index[1] = B, . .. ...索引[25] = Z。 DIGITS 的计数给出 26 ^ DIGITS 组合

现在,我已经编写了这段代码:

#include <stdio.h>
#include <ctype.h>
#include <math.h>

unsigned int letterToIndex(char c);
char indexToLetter(unsigned int index);

int main(void)
{

    printf("Printing Index table:\n\n");

    const int DIGITS = 2;
    const int ALPHABSIZE = 26;

    int currentIdx = 0; // current index

    const int endIndex = pow(ALPHABSIZE, DIGITS);
    
    // this should be 
    //double bit5 = log(32) / log(2);
    //printf("log(32) / log(2) AKA bit^5 should be: %f", bit5);
        
    while (currentIdx < endIndex)
    {
        
        printf("index[%i] = ", currentIdx);
        
        /*for (int i = 0; i < DIGITS; ++i)
        {
            //float logarithm = log( (currentIdx / ALPHABSIZE) % ALPHABSIZE ) / log(DIGITS);
            float logarithm = log( currentIdx % ALPHABSIZE ) / log(DIGITS);

            printf("%c", indexToLetter( (int) logarithm ));
        }*/
        
        
        // letter 
        //unsigned int idxLetter = letterToIndex(i) * ALPHABSIZE + letterToIndex(i+1);
        
        ///////////////////////////////////////////////////////////////////////////////
        // I have an obvious pattern here vv
        
        // here I print only 2 digits hard-coded
        // prints the 1st digit
        printf("%c", indexToLetter( (currentIdx / ALPHABSIZE) % ALPHABSIZE ));
        // prints the 2nd digit
        printf("%c", indexToLetter( currentIdx % ALPHABSIZE ));
        
        // obvious pattern ^^
        //////////////////////////////////////////////////////////////////////////////
        
        printf("\n");
        currentIdx++;
    }

    
    // if DIGITS are only 1 sized:
    // index[0] = A
    // index[1] = B
    // index[2] = C
    // index[3] = D
    // index[4] = E
    // ... ... ...
    // index[25] = Z

    // DIGITS having size of 2:
    // index[0] = AA
    // index[25] = AZ
    // index[26] = BA   =   index[ 1 * 26 + 0  ] = index[26]
    // index[30] = BE   =   index[ 1 * 26 + 4 ] = index[30]
    // ... ... ...
    // index[107] = ED =    index[ 4 * 26 + 3 ] = index[107]
 
    return 0;
}

// maps the ASCII range from 'A' = 0 to 'Z' = 25
unsigned int letterToIndex(char c)
{
    return toupper(c) - 'A';
}

// get any letter from 0 to 25: from 'A' to 'Z'
char indexToLetter(unsigned int index)
{
    return toupper(index + 65);
}

我已经注释掉了 main 中的 for loop(在 while 块中),这次硬编码为 printf currentIdx's while 循环中每次迭代时的第一个数字,然后是第二个数字。

但它让我印象深刻,就像它要求对数...我如何在 for 循环中自动执行此操作?我非常相信这两行,而不是两行 printf

printf("%c", indexToLetter( (currentIdx / ALPHABSIZE) % ALPHABSIZE ));
printf("%c", indexToLetter( currentIdx % ALPHABSIZE ));

可以与正确的(也许是对数?)解决方案放在一行中。如果它是 DIGITS 尺寸 1,则只有第二行适用。尺寸 3 的 DIGITS 需要与 3 的幂相反。显然是 DIGITS

但是如何在循环中使用这种模式呢?假设 const int DIGITS(当前设置为 2)可以更改为更高。如何使其动态化以便将每个数字的字母组合起来?

可以从pow(ALPHABSIZE, DIGITS - 1)开始,用整数除法得到每个地方的value/table索引。在每个循环中,您连续减少 ALPHABSIZE 的系数,直到 1。这使您可以从左到右输出。

这里不需要计算对数。要计算整数对数,您仍然可以以相同的方式计算通过 while/for 循环的次数。