求一个能够简化log表达式的算法:
求一个能够简化log表达式的算法:
麻烦大家帮忙想一种能够简化log表达式的算法:
例如输入log(2,8),则输出精确的结果3,输入log(16,64),则输出3/2;
而如log(2,3)没有办法输出精确值的表达式则原样输出。
谢谢~!
[解决办法]
造一个表(数组),每个元素有3个成员,n,a,e,满足条件 n= a^e, 如果对某个n,有2个对应的值,仅取较小的那个a.
如果0 <=n < 2^32,则这个表的元素的个数 不会比 65536 大很多。下面给出造表的为代码:
struct _item
{
unsigned long n;
unsigned long a;
unsigned long e;
};
int find(unsigned long n,struct _item tab[],int len); //在长度为len的数组中查找,如果存在一个元素 item,且item.n=n,则返回其索引,否则返回-1
unsigned long pow(unsigned long n,unsigned long e); //返回 n的e次方
int generateTab(struct _item tab[])//造表并返回表中元素的个数。
{
int tabLen=0;
unsigned long R=4294967295
unsigned n,a,e,x;
while (i*i <=R)
{
e=2;
while (true)
{
x=pow(i,e);
if ( i^e 超过R)
break;
if ( find(x,tab,tabLen)== -1 )
{
tab[tabLen]=(x,i,e);tabLen++;
}
e++;
}
i++;
}
//将表中的各个元素按照tab[i].n排序
return tabLen;
}
log(unsigned n1,unsigned n2)
{
if(n1==n2)
{
printf( "log(%d,%d)=1 ",n1,n2);
return;
}
b1=find(n1,tab,tabLen);
b2=find(n2,tab,tabLen);
if (b1!=-1 and b2!=-1 and tab[b1].a== tab[b2].a)
{
if (b2 % b1==0)
printf( "log(%d,%d)=%d ",n1,n2,b2/b1);
else
{
b3= (b1 ,b2)的最大公约数
printf( "log(%d,%d)=%d/%d,n1,n2,b2/b3,b1/b3);
}
}
else if ( b2!=-1 and tab[b2].a==n1)
{
printf( "log(%d,%d)=%d ",n1,n2,tab[b2].e);
}
}