poj 1001 Exponentiation 五个小时。。。回来重写

来源:互联网 发布:淘宝属于什么行业分类 编辑:程序博客网 时间:2024/05/18 13:06
 
#include <stdio.h>#include<string.h>const int MAXN=10000;int sum[MAXN],sum1[MAXN];void Carry(int len){     int c=0,i;for (i=0;i<len;i++)    {    int s=sum[i]+c;        sum[i]=s%10;c=s/10;     }}int main(int argc, char *argv[]){int i,j,cas,n,c,k,t;char ch1[MAXN],ch[10];int flag1,flag2,flag3;while(gets(ch)!=NULL){flag1=0,flag2=0,flag3=0;    memset(ch1,0,sizeof(ch1));    memset(sum,0,sizeof(sum));for (i=0;ch[i]!=' ';i++)       ch1[i]=ch[i];ch1[i]='\0';if(ch[7]==' ') n=0;//前六位是底数  后两位是指数 else if(ch[7]>='0' && ch[7]<='9')  n=(ch[7]-48)*10;n=n+ch[8]-48;int len1=strlen(ch1);for (i=0;i<len1/2;i++){char change;change=ch1[i];ch1[i]=ch1[len1-i-1];ch1[len1-i-1]=change;}for (i=0;i<len1;i++)   if(ch1[i]=='.') break;if (i<len1)    t=n*i;//记录小数位数else t=0;    if(n==1)//n==1的情况 {    for (j=0;j<6;j++)     if(ch1[j]!=0 && ch1[j]!='.' ) { flag3=1; break; }//是否为0.00000的情况     if(flag3)        {   for (j=0;j<len1;j++)     if(ch1[j]!='0' && ch1[j]!=' ') break;int k1=j;   for (j=len1-1;j>=0;j--)     if(ch1[j]!='0') break;int k2=j;if(ch1[k1]=='.')//若为1.00000的情况   for (j=k2;ch1[j]!='.';j--)    printf("%c",ch1[j]);//直接打整数 else   for (j=k2;j>=k1;j--)     printf("%c",ch1[j]);    printf("\n");           }    else  printf("0\n");continue;}for (j=i;j<len1;j++)     ch1[j]=ch1[j+1]; for (i=0;i<len1;i++)    ch1[i]-=48;     if(t) ch1[len1-1]=0;    for (j=0;j<len1;j++) {c=0;   for (int k=0;k<MAXN;k++)   {int s=ch1[j]*ch1[k]+c;sum[k+j]+=s%10;c=s/10;   }} Carry(MAXN);for (i=1;i<=n-2;i++){for (j=0;j<len1;j++){c=0;for (int k=0;k<MAXN;k++){int s=sum[k]*ch1[j]+c;    sum1[k+j]+=s%10;c=s/10;}}    for (cas=0;cas<MAXN;cas++)        sum[cas]=sum1[cas];memset(sum1,0,sizeof(sum1));            Carry(MAXN);}c=0;for (i=MAXN-1;i>=0;i--)  if(sum[i])  break;         for (k=i;k>=0;k--)if(sum[k]!=0)  {  flag1=1 ; break; }if(flag1) {   for (;i>t-1;i--)      printf("%d",sum[i]);   for (k=i;k>=0;k--)      if(sum[k]!=0){ flag2=1;break;}             if(flag2)      {      if(t)  printf(".");      int z=t;      while(1)       {     if(z==(1+i)) break;     printf("0");      z--;          }        if(t)      {          for (j=0;j<=i;j++)          if(sum[j]) break;      }      for (;i>=j;i--)              {          printf("%d",sum[i]);          }           }       printf("\n"); }else  printf("0\n");}return 0;}