两个小数相乘,小数点后面位数没有限制,设计一个高精度算法

来源:互联网 发布:彩虹六号数据统计 编辑:程序博客网 时间:2024/05/17 02:17

下面是使用了string库函数的代码,也可以不用标准库函数,是腾讯的一道笔试题:

其中求字符串的长度,可以使用strlen,不用length()函数,

寻找“,”的位置,也可以不用find_last_not_of,而用循环匹配,来确定什么时候输出"."

其中剔除'.',也可以使用移位操作来实现

#include <iostream> #include <string> using namespace std; string mul(string, string); int main() { string sMul,sMul1,sRes; //以上依次为,乘数,当前结果 int iDot,iLen,iLen1,iTmp,iTmp1,i;int iExp;//以上依次分别为指数,小数点在结果中的位置,被处理过的乘数的当前长度,临时变量,循环变量 while(cin>>sMul>>sMul1){ iLen = sMul.length(); iTmp = sMul.find_last_not_of("0"); //从尾端查找第一个非0数的位置 if (iTmp < iLen-1) //如果这个位置不是乘数的末位(换言之这个乘数小数部分末尾有0) {   sMul.erase(iTmp+1,iLen-iTmp); //剔除乘数小数部分末尾的0   iLen = sMul.length(); //更新iLen的值 } iLen1=sMul1.length();iTmp1=sMul1.find_last_not_of("0");if(iTmp1<iLen-1){sMul1.erase(iTmp1+1,iLen1-iTmp1);iLen1=sMul1.length();}iTmp=sMul.find_first_of(".");iTmp1=sMul1.find_first_of(".");iDot=iTmp+iTmp1-1;sMul.erase(iTmp,1); //剔除被乘数的"." sMul1.erase(iTmp1,1);while (sMul[0]=='0') sMul.erase(0,1); //这个循环剔除乘数前面的0 sRes=sMul; sRes=mul(sMul,sMul1);while (sRes.length()<iDot) sRes='0'+sRes; //这个循环用来为结果补0,以添加小数点 if (iDot!=0) sRes.insert(iDot,".");cout << sRes << endl; } return 0; } string mul(string a,string b) { string sRes=""; //先置结果为空 int la,lb,i,j,temp1,temp2; //以上依次为乘数a/b的长度,两个循环变量,两个中间变量 la=a.length();lb=b.length(); for (i=0;i<la+lb;i++) sRes.insert(0,"0"); //根据结果的最大长度置0 for (i=lb-1;i>=0;i--) { temp1=0; for (j=la-1;j>=0;j--) { temp1+=(b[i]-48)*(a[j]-48); temp2=sRes[i+j+1]-48+temp1%10; sRes[i+j+1]=temp2%10+48; temp1=temp1/10+temp2/10; } sRes[i]=temp1+48; } //以上过程就是模拟计算 while (sRes[0]=='0') sRes.erase(0,1); //循环剔除结果前面的0 return sRes; }