2009-04-04 16:22:52來源不明

a+b??

大數浮點數運算

/***********************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
 char x[500],y[500];
 while(scanf("%s %s",x,y)==2)
  {
   int n=strlen(x),m=strlen(y);
   unsigned int ans[61]={0},ans2[501]={0};
   int flag1=n,flag2=m,a,b,c;
    for(a=0;a<n;a++)  if(x[a]=='.') break;
    for(b=0;b<m;b++)  if(y[b]=='.') break; 
    flag1=a;
    flag2=b;
    for(a=flag1-1,b=0;a>=0;a--,b++)  ans[b]=ans[b]+x[a]-48;
    for(a=flag2-1,b=0;a>=0;a--,b++)
     {
      ans[b]=ans[b]+y[a]-48; 
      if(ans[b]>=10)
       {
        ans[b+1]=ans[b+1]+ans[b]/10;
        ans[b]%=10;
       }
     }
    for(a=flag1+1,b=0;a<n;a++,b++)  ans2[b]=ans2[b]+x[a]-48;
    for(a=flag2+1,b=0;a<m;a++,b++)  ans2[b]=ans2[b]+y[a]-48;
    for(a=500;a>=0;a--)
      {
       if(ans2[a]>=10&&a!=0)
         {
          ans2[a-1]+=ans2[a]/10;
          ans2[a]%=10;
         }
       if(ans2[a]>4&&a==200) ans2[199]++;
        if(ans2[a]>=10&&a==0)
         {
          ans[0]+=ans2[a]/10;
          ans2[a]%=10;
         } 
      }
     if(ans[0]>=10)
      for(a=0;a<=200;a++)
       if(ans[a]>=10)
        {
         ans[a+1]+=ans[a]/10;
         ans[a]%=10; 
        }
       else break;
     int flag=0; 
     for(a=60;a>=0;a--)
     if(ans[a]!=0)
      {
       for(b=a;b>=0;b--)
        printf("%lu",ans[b]);
        flag=1;
        break;
      }
     if(flag==0)
      printf("0");
     printf(".");
     for(a=0;a<200;a++)
      printf("%lu",ans2[a]) ;
     printf("\n");
  }
 return 0;
}

/*************************************************/

作法II:缺乏停止條件 只好從測資數作判斷

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void point(unsigned int poii[])
{
  char cha;
  int top=1;
  poii[0]=getchar()-48;
    while(cha=getchar())   
    {  
     if(cha==' '||cha=='\n') break;  
     poii[top]+=cha-48;
     poii[top-1]=poii[top-1]+poii[top]/10;
     poii[top]%=10;
     top++;
    }  
}        
int input(unsigned int poii[])  
{  
  char cha,flag=1;  
  int x=0;  
  while(cha=getchar())  
     if(cha!=' '&&cha!='\n') break;  
   if(cha!='-')
       x=x*10+cha-48; 
   else flag=-1;  
  while(cha=getchar())   
    {  
     if(cha==' '||cha=='\n') break;  
     if(cha=='.')
      {point(poii);break;}
      x=x*10+cha-48;  
    }  
    return x*flag;  
}
main()
{
  int time=0;
 while(1)
   {
     time++;
     int a,b;
     unsigned int poii[500]={0};
     int n,m;
     n=input(poii);
     m=input(poii);
     if(poii[200]>4)
      {
       poii[199]++;
        if(poii[199]>=10)
         for(a=199;a>=1;a--)
             if(poii[a]>=10)
              {
              poii[a-1]=poii[a-1]+poii[a]/10;
              poii[a]%10;
              }
      }       
     if(poii[0]>=10)
      {n++;poii[0]%=10;}
     printf("%d.",n+m);
     for(b=0;b<200;b++)  
      printf("%lu",poii[b]);  
      printf("\n");
      if(time>=100000) break;
   }
 return 0;
}