首先举个例子说说思路:
输入str1:1.341 str2:11.2 在C语言中存储字符串的直接是字符型数组,strlen(str)代表字符串的长度(那个小数点也要算的),则str1,str2的长度为5和4。而浮点数加减运算时遵循从右往左计算,所以首先要使得字符串格式化。找到并返回存储字符串中小数点的下标,str1,str2小数点位置下标为1和2,然后用字符串长度减去即可求出小数点后的位数差,通过循环将短的加0补齐,为1.341,11.200,最后按最长长度循环将字符从右依次赋值给自定的c1,c2,先转成数计算再转换成字符存到结果数组中(注意进位)。
找小数点的方法
int findPoint(char *str) //寻找字符串的点的位置并返回 { int i,pPos; for(i=0;i<strlen(str);i++) { if(str[i]=='.') pPos=i; } return pPos; }
用0补齐字符串小数后的位数的方法
//前提是已经通过交换将小数点后位数多的字符串赋给str1,现在只补齐str2 void formal(int len1,int len2,char *str1,char *str2) { int i; int difNum=(len1-findPoint(str1))-(len2-findPoint(str2)); for(i=0;i<difNum;i++) { str2[i+len2]='0'; } len2=len2+difNum; }
加运算方法,编译时只需输入字符串再调用
void Add(char *result,char *str1,char *str2) { int i,len1,len2,c; if(strlen(str1)<strlen(str2)) { exChange(str1,str2); } int x=0; //进位值,初始为0 char c1,c2; len1=strlen(str1); len2=strlen(str2); c=len1; *(result+c+1)='\0'; //添加字符串结束标志 formal(len1,len2,str1,str2); for(i=0;i<=c;i++) //由后往前计算result对各位的值,直到得出*result的值 { if(len1-1<i) c1='0'; else c1=*(str1+ len1-1 -i); //将str1的各位依次赋给c1,下同 if(len2-1<i) c2='0'; else c2=*(str2+ len2-1 -i); //计算对应位 *(result+c-i) = (c1-'0'+c2-'0'+x)%10+'0'; x=(c1-'0'+c2-'0'+x) / 10 ; } if(*result=='0') //如果result的第一位为'0',则去掉该位 { for(i=0;*(result+i);i++) *(result+i)=*(result+i+1); } printf("result:%s\n",result); }
会了加法运算,减法运算就简单了,同样的方法先补0向右对齐,然后通过比较小数点的位置来判断大小,将绝对值大的赋给str1,最后和加法的依次赋值进行操作的方法一样,只是考虑了一下借位的值。
我的编程能力很菜,但在改进中,希望看过的各路大侠多提意见,谢谢。