您的位置:首页 > 其它

1001 Exponentiation

2008-10-28 20:01 141 查看
Description
Problemsinvolvingthecomputationofexactvaluesofverylargemagnitudeandprecisionarecommon.Forexample,thecomputationofthenationaldebtisataxingexperienceformanycomputersystems.

ThisproblemrequiresthatyouwriteaprogramtocomputetheexactvalueofRnwhereRisarealnumber(0.0<R<99.999)andnisanintegersuchthat0<n<=25.
Input
TheinputwillconsistofasetofpairsofvaluesforRandn.TheRvaluewilloccupycolumns1through6,andthenvaluewillbeincolumns8and9.
Output
TheoutputwillconsistofonelineforeachlineofinputgivingtheexactvalueofR^n.Leadingzerosshouldbesuppressedintheoutput.Insignificanttrailingzerosmustnotbeprinted.Don'tprintthedecimalpointiftheresultisaninteger.
SampleInput
95.12312
0.432120
5.123415
6.75929
98.99910
1.010012

SampleOutput
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

Hint
Ifyoudon'tknowhowtodeterminewheatherencountedtheendofinput:
sisastringandnisaninteger
C++

while(cin>>s>>n)

{

...

}

c

while(scanf("%s%d",s,&n)==2)//toseeifthescanfreadinasmanyitemsasyouwant

/*while(scanf(%s%d",s,&n)!=EOF)//thisalsowork*/

{

...

}
--------------------------------------------------------------------
#include<stdio.h>
#defineMAX200//按照本题的意思,只需用150个就够了
voidpower(int*a,intbase,intn)
{
inti,j,set=0;
memset(a,0,sizeof(int)*MAX);//将a清零
for(i=0,j=base;i<MAX;i++,j=j/10)
a[i]=j%10;
for(i=0;i<n-1;i++)
{
j=0;
for(j=0;j<MAX;j++)
{
set=a[j]*base+set;
a[j]=set%10;
set=set/10;
}}}
intmain(intargc,char**argv)
{
chars[MAX];
inta[MAX];
intn,i,base,len,k=0;
while(scanf("%s%d",s,&n)==2)
{
base=0;
len=strlen(s);
for(i=0;i<len;i++)//一直比较到len,增加了基数的范围
{
if(s[i]=='.')
{
k=len-(i+1);
continue;
}base=base*10+s[i]-'0';
}printf("base:%d/n",base);
if(k!=0)//k==0表示输入的基数没有小数部分,可以正确计算20^2
{
for(i=(len-1);s[i]=='0';i--,k--)
{
base=base/10;
}k=k*n;
}printf("base:%d/n",base);
power(a,base,n);

for(i=MAX-1;i>=0;i--)
{
if(a[i]!=0)
break;
}
//a[0]-a[k-1]为小数部分,所以至少应该从k-1处输出
if(i<=(k-1))//<==>if(k>i)
{
printf(".");
for(i=k-1;i>=0;i--)
printf("%d",a[i]);
}else
{
for(;i>=k;i--)
printf("%d",a[i]);
if(k!=0)
printf(".");
for(;i>=0;i--)
printf("%d",a[i]);
}printf("/n");
}
return0;
}
抄的别人的,但改了一小点。增加了点可用性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: