我怎样才能使用对数得到幂的相反数?
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
循环的次数。
我在学校的数学一直不太好,我意识到我实际上需要 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
循环的次数。