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

 
#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;
}

你可能感兴趣的:(poj 1001 Exponentiation 五个小时。。。回来重写)