小數的精度的加法 很自然的和整數的加法連在一起 于是 就把小數點隔開,分成兩部分加 。。只是在小數部分加的時候 進位 細節處理不當導致很多錯誤 也算是一次教訓吧 。。。
因為 中途修改過很多 代碼看起來 有點亂 呵呵
#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
付翔 閱讀(1486)
評論(0) 編輯 收藏 引用 所屬分類:
ACM 數據結構