C/C++编程小练习 大数乘法之浮点大数乘法算法
2016-12-27 19:33
337 查看
#include <iostream> #include <cstring> #include <cmath> using namespace std; void reverse_str(char *a,int size){ for(int i=0;i<size/2;++i){ char t=a[i]; a[i]=a[size-i-1]; a[size-i-1]=t; } } int f_to_i(char *a,char *c){//将浮点数字符串转化为整形字符串,并返回浮点数小数部分的长度 int len=strlen(a); char *p1=a; char *p2=NULL; for(int i=0;i<len;++i){ if(a[i]=='.'){ a[i]='\0'; p2=&a[i+1]; break; } } strcat(p1,p2); strcpy(c,p1); return strlen(p2)+1; } void large_mul(char a[],char b[],char c[]){//整形的大数乘法算法函数 char a_t[40000]={0}; char b_t[40000]={0}; char c_t[80001]={0}; strcpy(a_t,a); strcpy(b_t,b); int a_len=strlen(a_t); int b_len=strlen(b_t); reverse_str(a_t,a_len); reverse_str(b_t,b_len); for(int i=0;i<b_len;++i){ for(int j=0;j<a_len;++j){ int k=i+j; c_t[k]+=(a_t[j]-'0')*(b_t[i]-'0'); if(c_t[k]>9){ c_t[k+1]+=(c_t[k]/10); c_t[k]=c_t[k]%10; } } } int j; for(j=a_len+b_len;j>0;--j){ if(c_t[j]!=0){ break; } } c_t[j+1]=0; for(int i=j;i>=0;--i){ c_t[i]=c_t[i]+'0'; } reverse_str(c_t,strlen(c_t)); strcpy(c,c_t); } void large_float_mul(char a[],char b[],char c[]){//浮点数的大数乘法,其实就是综合运用了上面的两个函数,打印出结果并把结果放到c中 char p1[20000]={0}; char p2[20000]={0}; int pos1=f_to_i(a,p1);//将浮点型字符串转为整型字符串,并得到浮点数的小数部分的长度,以便后续计算小数点的位置 int pos2=f_to_i(b,p2); large_mul(p1,p2,c); int len=strlen(c); for(int i=0;i<len-pos1-pos2;++i){ cout<<c[i]; } cout<<"."; for(int i=len-pos1-pos2;i<len;++i){ cout<<c[i]; } cout<<endl; } int main(){ char a[20000]={0}; char b[20000]={0}; char c[40001]={0}; cin>>a; cin>>b; large_float_mul(a,b,c); return 0; }
相关文章推荐
- 算法解析之大数乘法
- 大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
- C++实现大数乘法算法代码
- 算法重拾之路——大数乘法
- 大数乘法算法
- 蓝桥杯算法提高 ADV-197 大数乘法 题解
- 算法收藏(stl 背包 并查集 矩阵乘法 java大数)
- 大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
- C/C++编程小练习 大数减法之浮点大数减法算法
- 【算法】大数乘法问题及其高效算法
- 大数乘法问题及其高效算法
- 每周算法练习——大数的乘法问题
- 大数运算之加法和乘法算法C++模板
- 算法-大数乘法(16进制)(C语言实现)
- 蓝桥杯——算法提高 大数加法&大数乘法&冒泡排序
- 一个简单的大数乘法算法
- 128 带有小数的浮点数 大数乘法
- 基础算法,大数加法和乘法的实现
- 大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
- 算法提高 高精度乘法 ————大数乘法