POJ 1001 解题报告

来源:互联网 发布:php常用的变量函数 编辑:程序博客网 时间:2024/05/14 11:36

这是一道基础的高精度的题目。对于高精度的题目,头脑一定要清晰,一定要细心。这种题,错的话还是比较难改的(除非用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;}