作者在 2009-04-12 11:28:00 发布以下内容
#include<stdio.h> #include<math.h>
#define N 62 //指定的指数
int main()
{
int i,x,exp=1,time=0;//exp记录指数,time用来统计乘法计算次数
scanf("%d",&x);
long double a,s=(long double)x;
while(exp!=N) //指数等于指定的指数结束循环
{
a=x;
for(i=1;exp<N;i*=2)//指数小于指定的时候,继续以平方的形式递乘
{ s*=a;//改变目标值
exp+=i;
a=a*a;//将原数平方
time++;
}
if(exp-N>N/2&&exp!=N)//判断这个时候是从原数开始乘还是从原数开始除的好
{
exp-=i/2;
s/=sqrt(a);
time--;
continue;
}
a=x;
for(i=1;exp>N;i*=2)//指数大于指定的时候,继续以平方的形式递除
{
s/=a;//改变目标值
exp-=i;
a=a*a;//将原数平方
time++;
}
};
printf("%lf,%d",s,time);
return 0;
}
用这个算法去算62次要9次,但如果是65次,只要七次即可
下面以62为例分析上面程序:
首先循环1:X*X*X^2*X^4*X^8*X^16*X^32=X^64(64 >62退出循环)共6次
64-62 >62/2不成立
跳过执行下一个循环2:X^64/X/X^2=X^61(61 <62退出循环)共2次
61!=62条件成立,执行WHILE
又开始执行循环1: X^61*X=X^62(62==62退出循环)共1次
后面的都不成立,直接退出WHILE,完毕
整体而言就是这样运算X*X*X^2*X^4*X^8*X^16*X^32/X/X^2*X=X^62;(共九次,实际分析的话,肯定最后两步肯定不会这样运算,这个是为了针对所有情况,选择的最佳方法)
如果是65的话就是:X*X*X^2*X^4*X^8*X^16*X^32^X^64/X^64(在实际分析中,这两步可以抵消)*X=X^65(去掉中间的两步就是7次)
#define N 62 //指定的指数
int main()
{
int i,x,exp=1,time=0;//exp记录指数,time用来统计乘法计算次数
scanf("%d",&x);
long double a,s=(long double)x;
while(exp!=N) //指数等于指定的指数结束循环
{
a=x;
for(i=1;exp<N;i*=2)//指数小于指定的时候,继续以平方的形式递乘
{ s*=a;//改变目标值
exp+=i;
a=a*a;//将原数平方
time++;
}
if(exp-N>N/2&&exp!=N)//判断这个时候是从原数开始乘还是从原数开始除的好
{
exp-=i/2;
s/=sqrt(a);
time--;
continue;
}
a=x;
for(i=1;exp>N;i*=2)//指数大于指定的时候,继续以平方的形式递除
{
s/=a;//改变目标值
exp-=i;
a=a*a;//将原数平方
time++;
}
};
printf("%lf,%d",s,time);
return 0;
}
用这个算法去算62次要9次,但如果是65次,只要七次即可
下面以62为例分析上面程序:
首先循环1:X*X*X^2*X^4*X^8*X^16*X^32=X^64(64 >62退出循环)共6次
64-62 >62/2不成立
跳过执行下一个循环2:X^64/X/X^2=X^61(61 <62退出循环)共2次
61!=62条件成立,执行WHILE
又开始执行循环1: X^61*X=X^62(62==62退出循环)共1次
后面的都不成立,直接退出WHILE,完毕
整体而言就是这样运算X*X*X^2*X^4*X^8*X^16*X^32/X/X^2*X=X^62;(共九次,实际分析的话,肯定最后两步肯定不会这样运算,这个是为了针对所有情况,选择的最佳方法)
如果是65的话就是:X*X*X^2*X^4*X^8*X^16*X^32^X^64/X^64(在实际分析中,这两步可以抵消)*X=X^65(去掉中间的两步就是7次)