hdu 1753 高精度小数加法

hdu 1753 高精度小数加法
  

小数的精度的加法 很自然的和整数的加法连在一起 于是 就把小数点隔开,分成两部分加 。。只是在小数部分加的时候 进位 细节处理不当导致很多错误 也算是一次教训吧 。。。
因为 中途修改过很多 代码看起来 有点乱 呵呵
 

#include
< stdio.h >
#include
< string .h >
#include
< stdlib.h >

void  partition_string( char  _a[], char  _a1[], char  _a2[])
{
    
char   * str;
    
int  i,j,len;
    str 
=  strchr(_a, ' . ' ); //  
     if (str != NULL)
    {
        len 
=  strlen(_a); // len = strlen(str); // 这是错误的源泉 对于 1.1234567  这个是得到 .1234567的长度 
        strncpy(_a1,_a,(str - _a) / sizeof ( char ));
        _a1[(str
- _a) / sizeof ( char )]  =   ' \0 ' ;
        
        
for (j  =   0 , i  =  (str - _a) / sizeof ( char +   1 ;i <  len;i ++ ,j ++ )
            _a2[j] 
=  _a[i];
        _a2[j] 
=   ' \0 ' ;
    }
    
else  
    {
        strcpy(_a1,_a);
        strcpy(_a2,
"" );
    }

}
void  supply( char  _a[], int  len) // 对于小数区不足的以0补足 
{
    
int  count  =  strlen(_a),i;
    
for (i  =  count ; i  <  len;i ++ ) // for(i = count ; count < len;i++) 单步调试 才测出这个错误
        _a[i]  =   ' 0 ' ;
    _a[i] 
=   ' \0 ' ;
}
int  check( char  _str[]) // 这里貌似没有把0 去掉 而是换成了 空字符 for(k = i;k < len;k++) 
{    
    
/* 12121213213124342545354545 13312312321312321321.02300000000000000000000000000
    这个测试数据 0.023 0000  后面的0 也会打印出来 因为for(k = i;k < len;k++) 这个我没有加 str[i]!='\0'
*/
    
int  i,len  =  strlen(_str);
    
for (i  =  len - 1 ;i >= 0 ;i -- )
    {
        
if (_str[i]  ==   ' 0 ' ) _str[i]  =   ' \0 ' ;
        
else   return  i;
        
// if(_str[i] != '0' ) break;
    }
    
// _str[i+1] = '\0'; 
    
// if(i == 0) return 0;
     return   - 1 ;
}
void  add( char  a[], char  b[], char  back[]) // 大数 加
{
    
int  i,j,k,up,x,y,z,l;
    
char   * c;
    
if  (strlen(a) > strlen(b)) l = strlen(a) + 2 else  l = strlen(b) + 2 ;
    c
= ( char   * ) malloc(l * sizeof ( char ));
    i
= strlen(a) - 1 ;
    j
= strlen(b) - 1 ;
    k
= 0 ;up = 0 ;
    
while (i >= 0 || j >= 0 )
    {
        
if (i < 0 ) x = ' 0 ' else  x = a[i];
        
if (j < 0 ) y = ' 0 ' else  y = b[j];
        z
= x - ' 0 ' + y - ' 0 ' ;
        
if (up) z += 1 ;
        
if (z > 9 ) {up = 1 ;z %= 10 ;}  else  up = 0 ;
        c[k
++ ] = z + ' 0 ' ;
        i
-- ;j -- ;
    }
    
if (up) c[k ++ ] = ' 1 ' ;
    i
= 0 ;
    c[k]
= ' \0 ' ;
    
for (k -= 1 ;k >= 0 ;k -- )
        back[i
++ ] = c[k];
    back[i]
= ' \0 ' ;


int  main()
{
    
// freopen("in.txt","r",stdin);
     char  a[ 500 ],b[ 500 ],temp[ 10 ];
    
char  sum1[ 500 ],sum2[ 500 ];
    
char  a1[ 500 ],a2[ 500 ],b1[ 500 ],b2[ 500 ];
    
char   * str, * str2; int  len,lena,lenb,i,j,k,l,num;
    
while (scanf( " %s%s " ,a,b) != EOF)
    {
        memset(a1,NULL,
500 );memset(a2,NULL, 500 );//这个其实可以去掉
        memset(b1,NULL,
500 );memset(b2,NULL, 500 );
        partition_string(a,a1,a2);partition_string(b,b1,b2);
        lena 
=  strlen(a2);lenb = strlen(b2);
        len 
=  lena > lenb ? lena:lenb;
        
if (lena  <  lenb)
            supply(a2,len);
        
else   if (lena  >  lenb)
            supply(b2,len);
        add(a2,b2,sum2);
        add(a1,b1,sum1);

        i 
=   0 ;
        
if ( len  <  strlen(sum2) )
            i 
=   1 ,num  =  sum2[ 0 ] - ' 0 ' ;
        
if (i  ==   1 )
        {
            
/* k = sum1[strlen(sum1)-1] - '0';//这里的进位考虑不周到
            sum1[strlen(sum1)-1] = (k+num)%10 + '0';
            if(k + num > 9)
                sum1[strlen(sum1)-2]+=1;
*/
            
for (j  =  strlen(sum1) - 1 ; j >= 0  ;j -- // 考虑 xxx99999 进位的情况
            {
                k 
=  sum1[j]  -   ' 0 ' ;
                
if (k  +  num  >   9 ) {sum1[j]  =   (k + num) % 10   +   ' 0 ' ; num  =   1 ;}
                
else  {sum1[j]  =  k  +  num  +   ' 0 ' ; break ;}
            }
            
if (j  ==   - 1 ) // 如果 出现 整数是99999 然后进了一位 这样的情况
                printf( " 1 " );
        }
        printf(
" %s " ,sum1);
        
if (check(sum2)  >   0   || (check(sum2)  ==   0   &&  i != 1 ))  printf( " . " );
        len 
=  strlen(sum2);
        
for (k  =  i;k  <  len  &&  sum2[k] != ' \0 ' ;k ++ )
            printf(
" %c " ,sum2[k]);
        printf(
" \n " );
        memset(a,NULL,
500 );memset(b,NULL, 500 );

    }
    
return   0 ;
}


你可能感兴趣的:(hdu 1753 高精度小数加法)