您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: