很奇怪,我的代码在poj上能ac在hdoj上却ac不了,题目是完全一样的啊。。。
蛋疼呀!(/ □ \)
思路:这道题不难,但有几种情况要考虑。
1.得到的数是整数,不需要输出小数点
2.小数点前没有整数
3.小数点前有整数
我先把浮点数转化为整数,比如1.0100变为101,并记录小数点的位置,然后用处理大数相乘的方法,设一个数组a[],
将个位的1存在a[0],十位的0存在a[1],百位的1存在a[2]。再进行乘操作,每位都乘以101,乘完后进行进位处理。如此
循环操作,最后得到解。
额,无奈的代码
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main()
{
long long a[130];
char str[7];
int n,r1,r2;
int w,i,len,n1,d,x,x1;
while(~scanf("%s%d",str,&n))
{
memset(a,0,sizeof(a));
i=0;w=0;x=5;
for(x=5;x>=0;x--)
{
if(str[x]!='0')break;
}x1=x;
while(str[x]!='.'&&x>=0)
{
w++;x--;
}
for(x=x1;x>=0;x--)
{
if(str[x]=='.')continue;
a[i]=str[x]-'0';i++;
}
r1=a[0]+10*a[1]+100*a[2]+1000*a[3]+10000*a[4]+100000*a[5];
len=i;n1=n;n=n-1;
while(n--)
{
for(i=0;i<len;i++)
a[i]*=r1;
long long temp,k=0;
for(i=0;i<len;i++)
{
temp=k+a[i];
a[i]=temp%10;
k=temp/10;
}
while(k)
{
a[len++]=k%10;
k=k/10;
}
}
w=w*n1;
d=len-w;
if(w==0)
{
for(x=len-1;x>0;x--)
printf("%lld",a[x]);
printf("%lld\n",a[x]);
}
else
{
if(d>0)
{
for(x=len-1;x>=len-d;x--)
printf("%lld",a[x]);
printf(".");
for(;x>0;x--)
printf("%lld",a[x]);
printf("%lld\n",a[x]);
}
else
{
printf(".");
for(x=0;x<-d;x++)
printf("0");
for(x=len-1;x>0;x--)
printf("%lld",a[x]);
printf("%lld\n",a[x]);
}
}
}
return 0;
}
都能通过的代码:
#include<string>
#include<memory>
using namespace std;
#include<math.h>
#include<stdio.h>
#define DEPTH 1000000000
int exponent,value,fractionalLen;
__int64 result[25];
void multi()
{
for(int i=1;i<exponent;i++)
{
int assist=0;
for(int j=1;j<=result[0];j++)
{
result[j]=result[j]*value+assist;
assist=result[j]/DEPTH;
result[j]=result[j]%DEPTH;
}
if(assist>0)
{
result[0]++;
result[result[0]]=assist;
}
}
}
int main()
{
//freopen("Exponentiation.txt","r",stdin);
char vtemp[7];
while(scanf("%s%d",&vtemp,&exponent)!=EOF)
{
memset(result,0,sizeof(result));
value=0;
fractionalLen=0;
for(int i=5,cnt=0;i>=0;i--)
{
if(vtemp[i]>='0'&&vtemp[i]<='9')
{
value=value+(vtemp[i]-'0')*pow(10.0,cnt);
cnt++;
}
else
fractionalLen=5-i;
}
while(value%10==0&&fractionalLen>0)
{
value/=10;
fractionalLen--;
}
result[1]=value;
result[0]=1;
multi();
fractionalLen*=exponent;
char assist[10];
sprintf(assist,"%d",result[result[0]]);
string answer(assist);
int len=(result[0]-1)*9+strlen(assist);
for(int i=result[0]-1;i>=0;i--)
{
sprintf(assist,"%9d",result[i]);
answer+=assist;
}
if(fractionalLen>len)
{
printf(".");
for(int i=fractionalLen-len;i>0;i--)
printf("0");
}
for(int i=0;i<len;i++)
{
if(i==len-fractionalLen)
printf(".");
if(answer[i]==' ')
printf("0");
else
printf("%c",answer[i]);
}
printf("\n");
}
return 0;
}