两个小数相乘,小数点后面位数没有限制,设计一个高精度算法
2011-08-22 15:40
405 查看
下面是使用了string库函数的代码,也可以不用标准库函数,是腾讯的一道笔试题:
其中求字符串的长度,可以使用strlen,不用length()函数,
寻找“,”的位置,也可以不用find_last_not_of,而用循环匹配,来确定什么时候输出"."
其中剔除'.',也可以使用移位操作来实现
其中求字符串的长度,可以使用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; }
相关文章推荐
- 两个数相乘,小数点后位数没有限制,请写一个高精度算法
- 两个数相乘,小数点后位数没有限制,请写一个高精度算法
- 两个数相乘,小数点后位数没有限制,请写一个高精度算法
- 两个数相乘,小数点后位数没有限制,请写一个高精度算法
- 两个数相乘,小数点后位数没有限制,请写一个高精度算法【转】
- 两个数相乘,小数点后位数没有限制…
- 两个数相乘,小数点后位数没有限制
- 两个数相乘,小数点后的位数没有限制
- 猜算式 □□ x □□ = □□ x □□□ 它表示:两个两位数相乘等于一个两位数乘以一个三位数。 如果没有限定条件,这样的例子很多。
- iOS限制输入的小数点后面的位数
- 有两个浮点数a,b,计算a/b,要求保留小数点后面n 位(我写出小数点只能保存9~15位有效位数)
- 获得一个数值的有效小数位数(不含后面的0补位)
- Android 限制EditText输入小数点后面位数
- jquery easyui datagrid中NumberBox限制小数位数后不能输入小数点的解决办法
- 蓝桥杯 两个两位数相乘等于一个两位数乘以一个三位数
- delphi 四舍五入保留一位或两位小数,1位小数2位小数四舍五入写法,后面参数为保留小数点位数
- 猜算式 看下面的算式: □□ x □□ = □□ x □□□ 它表示:两个两位数相乘等于一个两位数乘以一个三位数。
- 价格小数处理,小数点后面字符多余3个时候,取一个
- 工具类:限制EditText输入小数位数,按照金额格式进行输入
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网