小数的精度的加法 很自然的和整数的加法连在一起 于是 就把小数点隔开,分成两部分加 。。只是在小数部分加的时候 进位 细节处理不当导致很多错误 也算是一次教训吧 。。。
因为 中途修改过很多 代码看起来 有点乱 呵呵
#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;
}
posted on 2010-04-24 13:35
付翔 阅读(1483)
评论(0) 编辑 收藏 引用 所属分类:
ACM 数据结构