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