北大ACM1001 exponentiation 用C语言怎么写呢?对高精度数应该怎么处理?Description对数值很大、精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题.现在要你

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/01 15:51:08
北大ACM1001 exponentiation 用C语言怎么写呢?对高精度数应该怎么处理?Description对数值很大、精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题.现在要你
xV[Of+A NVjjow-ӚLN*% K3ZDs g犿*u7&c}ޣ2,>>ُH'W$%"GyӷΟq%ѴVK)-\?%eTN,%=R0cj-О1G %ir*Z5_6p*+Z5b`Ζۇ9/l8xu\%x}6nwrpnƴfqdB75`K09aᕏ6*x"kF]n~x'q~\?(`‘?ȯ5רkZQBhEj (228DZ<`1,yfIր39Gz1vww7IP8sfɥIUSbS߽"nQɇRHG`M_#0Z-ȉ:+Eǡ'M|gř,Ѿ&GR[xG RR'(KՍ!>`LN~UdN@t6)iu\PBgҴE%3cmyo{aP@?' !xZZ*`Zu ̋: EmPbe KrvԷO ؤk4-@SpԼ!Gňn8aV3"IC@w7ҵY4 !(L{ SֺΌxpDVa?kڅ(5l(g#7.^TRĪ@Ǿǫ qqWC(7;]GR^}X> OQqbmm2ŒyS:5]gnHkʡjp<Y Ș/ F ǔ8݀c`!p9v?UaM˯e%4jRjAV^pIBdrTW\|n6< גz/ZֲKaV_ʳ+$+ LX' j* xj^uQw*==rD 材^PN?y^גO㱒76Ő҉(X^\ )A<+ψ!Ń.v-\99ωsHpc3A4SLYDr:6yLws. |*R7>уzzL  }xd!I CڄH0oHl:͌< A7S.nD _EF`7h

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

北大ACM1001 exponentiation 用C语言怎么写呢?对高精度数应该怎么处理?Description对数值很大、精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题.现在要你
昨天刚做的这个题,现在把大概思路和代码(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