高精度小数乘方
题目:求一个小数的n次方数据:
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
输出:
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
思路:先将小数化为整数,先对整数求乘方,然后加上小数点
现在代码写好了,样例和自己的数据都过了,但是交上去wrong Answer,不知什么原因,请各位多出些BT数据,或指出我还有什么情况没有考虑到
有这几种情况都考虑到了:
1.前需要补0 (如数据2)
2.后需要去0 (如最后一个数据) 比如 1.0 10 应输出1 如果没有处理会打印:"1.0000000000"
3.整数情况 (比如 9 9)9的9次方 应输出"387420489"
4.如果结果为整数需要去掉小数点 比如 1.0 10 应输出1 若没有处理会打印:"1."
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int sum[10000];
int t[10000];
void amass(int a[],int b[],int a_length,int b_length)
{
int i,j,temp;
for(i=0;i<a_length;i++)
{
temp=0;
for(j=0;j<b_length;j++)
{
temp=a[i]*b[j]+temp/10+t[i+j];
t[i+j]=temp%10;
}
t[i+j]=temp/10;
}
}
int main()
{
char temp[1000];
int temp1[10000];
int number[1000];
int i,j,n,len,now,sum_length,pos;
memset(temp,0,sizeof(temp));
while(scanf("%s",temp)!=EOF)
{
now=0;
memset(number,0,sizeof(number));
memset(sum,0,sizeof(sum));
memset(t,0,sizeof(t));
scanf("%d",&n);
if(n==1)
{
printf("%s\n",temp);
continue;
}
if(n==0)
{
printf("1\n");
continue;
}
len=strlen(temp);
for(i=0;i<len;i++)
if(temp[i]=='.')//删除.
{
for(j=i;j<len;j++)
temp[j]=temp[j+1];
now=i;
break;
}
strrev(temp);
if(now!=0)//如果now不等于0 说明有小数点
{
len--;
for(i=0;i<len;i++)
number[i]=temp[i]-48;
now=len-now;
}
else//否则没有小数点
{
for(i=0;i<len;i++)
number[i]=temp[i]-48;
now=0;
}
amass(number,number,len,len);
sum_length=len+len;
while(t[sum_length]==0&&sum_length>0)
sum_length--;
for(j=0;j<=sum_length;j++)
sum[j]=t[j];
for(i=2;i<n;i++)
{
memset(t,0,sizeof(t));
amass(number,sum,len,sum_length+1);
sum_length=len+sum_length;
while(t[sum_length]==0&&sum_length>0)
sum_length--;
for(j=0;j<=sum_length;j++) sum[j]=t[j];
}
if(now==0)
{
for(i=sum_length;i>=0;i--)
printf("%d",sum[i]);
printf("\n");
}
else
{
pos=now*n;
if(pos<=sum_length)
{
for(i=0;i<=sum_length;i++)
{
if(i==pos)
{
temp1[i]=-1;
break;
}
else
temp1[i]=sum[i];
}
pos=i;
for(j=i;j<=sum_length;j++)
temp1[++pos]=sum[j];
pos=0;
for(i=0;i<=sum_length+1;i++)
if(temp1[i]==0)
pos++;
else
break;
if(temp1[i]==-1)
pos++;
for(i=sum_length+1;i>=pos;i--)
{
if(temp1[i]!=-1)
printf("%d",temp1[i]);
else
printf(".");
}
printf("\n");
}
else
{
printf(".");
for(i=0;i<pos-sum_length-1;i++)
printf("0");
for(i=0;i<=sum_length;i++)
temp1[i]=sum[i];
pos=i;
for(j=i;j<=sum_length;j++)
temp1[++pos]=sum[j];
pos=0;
for(i=0;i<=sum_length+1;i++)
if(temp1[i]==0)
pos++;
else
break;
for(i=sum_length;i>=pos;i--)
printf("%d",temp1[i]);
printf("\n");
}
}
memset(temp,0,sizeof(temp));
memset(temp1,0,sizeof(temp1));
}
//system("pause");
return 0;
}
[ 本帖最后由 sunyh1999 于 2011-7-28 12:48 编辑 ]