这是一道基础的高精度的题目。对于高精度的题目,头脑一定要清晰,一定要细心。这种题,错的话还是比较难改的(除非用DEBUG,好吧,我用了……)。
基本思路就是把所有的数字反过来存放在字符串数组中,然后一位一位的模拟手算。
要注意的是:
1、字符‘n’和数字n之间的转换要搞清;
2、每次更新是尽量把数组清零,否则可能使上一次运算的结果影响这一次的运算。
另外,高精度的题还要尽量减少计算量,高精度的题目本来效率就是比较低的,很容易TLE。
再贴下本人代码,比较乱……
#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
return a>b?a:b;
}
void rev(char num[],int n)
{
char temp[6]={0};
int i;
for (i=0;i<n;++i)
temp[n-1-i]=num[i];
for (i=0;i<n;++i)
num[i]=temp[i];
}
void add(char x1[],char x2[])
{
int i,j,r,cf=0;
char temp[200]={0};
for (i=0;i<max(strlen(x1),strlen(x2));++i)
{
r=(x1[i]==0?'0':x1[i])+(x2[i]==0?'0':x2[i])-'0'-'0'+cf;
temp[i]=r%10+'0';
cf=r/10;
}
temp[i]=cf;
memcpy(x1,temp,sizeof(temp));
}
void mul(char x1[],char x2[])
{
int i,j,r,cf,p=0,k;
char temp[200]={0},last[200]={0};
for (i=0;i<strlen(x1);++i)
{
cf=0;
k=p;
for (j=0;j<k;++j)
temp[j]='0';
for (j=0;j<strlen(x2);++j)
{
r=(x1[i]-'0')*(x2[j]-'0')+cf;
temp[k++]=r%10+'0';
cf=r/10;
}
temp[k]=cf+'0';
add(temp,last);
++p;
memcpy(last,temp,sizeof(temp));
}
memcpy(x1,temp,sizeof(temp));
}
void pow(char x[],char ans[],int n)
{
int i;
char temp[200]={'1'};
for (i=0;i<n;++i)
mul(temp,x);
memcpy(ans,temp,sizeof(temp));
}
bool test1(char temp[],int d)
{
int sum=0,i;
for (i=4;i>=d;--i)
sum+=temp[i]-'0';
if (sum==0)
return true;
return false;
}
bool test2(char temp[],int d)
{
int sum=0,i;
for (i=d-1;i>=0;--i)
sum+=temp[i]-'0';
if (sum==0)
return true;
return false;
}
void print(char temp[],char ans[],int d,int n)
{
int i,j,flag_int=0,flag_dig=0;
int p=d*n;
if (test1(temp,d))
flag_int=1;
if (test2(temp,d))
flag_dig=1;
if (flag_int&&flag_dig)
{
printf("0\n");
return;
}
int len=strlen(ans);
for (i=199;(ans[i]==0||ans[i]=='0')&&i>=p;--i);
for (j=0;ans[j]=='0'&&j<p;++j);
while (j<=i)
{
if (i==p-1)
printf(".");
printf("%c",ans[i]);
--i;
}
printf("\n");
}
int main()
{
char num[7],ans[200],temp[200]={0};
int n,d,i; //d:小数位数
while (scanf("%s %d",num,&n)!=EOF)
{
memset(ans,0,sizeof(ans));
memset(temp,0,sizeof(temp));
for (i=5;num[i]!='.';--i)
temp[i-1]=num[i];
d=5-i;
while (i--)
temp[i]=num[i];
rev(temp,5);
pow(temp,ans,n);
print(temp,ans,d,n);
}
return 0;
}