北大ACM1001 exponentiation 用C语言怎么写呢?对高精度数应该怎么处理?

问题描述:

北大ACM1001 exponentiation 用C语言怎么写呢?对高精度数应该怎么处理?
Description
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题.
现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n
1个回答 分类:综合 2014-12-13

问题解答:

我来补答
昨天刚做的这个题,现在把大概思路和代码(c++)给你吧
这个题很明显不能直接乘,因为没有那个类型能到达如此之精度,因为有好多次方吗,于是我把每次相乘的结果结果保存在int r[151]数组里面,数组中每个元素保存结果中的一位,如例子中最后一组1.01 的12次方的结果为1.126825030131969720661201,那么最后,r中元素为:r[1]=1、r[2]=1、r[3]=2、r[4]=6.
计算时乘数忽略了小数点和无效0,如1.0100计算时使用101,而r初始值为乘数即,r[1]=1,r[2]=0、r[3]=1;然后与乘数101相乘12-1=11次,每次相乘都是r中每个元素与乘数相乘,相乘后r中每个元素不在是保存一位数,于是需要进位,使r中元素仍只有一位数.这样计算的话,r数组中每个元素都不会超出精度,因为每次相乘都是一位数和乘数相乘.由于忽略了小数点,所以计算前需要确定是否有小数点,如果有的话小数点后有几位有效数字也要确定,然后就可以得出计算完成后小数点后有几位有效数字,输出就能将小数点加进去了.
这就是大概过程 代码如下:
#include
#include
#include
using namespace std;
int main()
{
string mlp; //乘数
int power; //乘数的幂
int r[151]; //保存结果
int hdot;
while(cin>>mlp>>power)
{
hdot=0;
for(int t=0;t0&&itr>=mlp.begin())
{
if(*itr!='0')
{break;}
hdot--;
itr--;
}
int cn=0;
while(itr>=mlp.begin())
{
if(*itr!='.')
{
r[cn]=*itr-'0';
cn++;
}
itr--;
}
int k=cn-1;
int m=0; //保存临时数;
while(k>-1)
{
m=m*10+r[k];
k--;
}
for(int i=1;i-1)
{
r[j]=r[j]*m;
j++;
}
j=0;
while(r[j]>-1)
{
if(r[j+1]==-1&&r[j]>=10)
r[j+1]=r[j]/10;
else
r[j+1]+=r[j]/10;
r[j]=r[j]%10;
j++;
}
}
hdot=hdot*power;
int cnt=0;
while(r[cnt]>-1)
{
cnt++;
}
if(hdot>=cnt)
{
cout
 
 
展开全文阅读
剩余:2000
下一页:生物 酶