求助c++程序高精度乘法
主要是想问我的程序哪里错了,或是哪里还可以改进,谢谢。#include<iostream>#include<cstdlib>#include<string>#includ...
主要是想问我的程序哪里错了,或是哪里还可以改进,谢谢。
#include <iostream>
#include <cstdlib>
#include <string>
#include <cmath>
#include <memory.h>
using namespace std;
int val(string s)
{
return (atoi(s.c_str()));
}
int s2n(string s,int *n)
{
for(int i=s.size(),j=-1;;)
{
if(i<4)
{
n[++j]=val(s.substr(0,i));
break;
}
else
{
i-=4;
n[++j]=val(s.substr(i,4));
}
}
return 0;
}
int z(int n)
{
return ((n-1)/4+1);
}
int main()
{
string s;
int n,l,la,lb,lc;
getline(cin,s);
la=s.size();
int *a=new int [z(la)];
memset(a,0,z(la)*sizeof(int));
s2n(s,a);
getline(cin,s);
lb=s.size();
int *b=new int [z(lb)];
memset(b,0,z(lb)*sizeof(int));
s2n(s,b);
lc=la+lb;
int *c=new int [z(lc)];
memset(c,0,z(lc)*sizeof(int));
for(int i=0;i<z(la);i++)
for(int j=0;j<z(lb);j++)
c[i+j]+=a[i]*b[j];
for(int i=0;i<z(lc);i++)
{
n=c[i]/10000;
c[i]%=10000;
if(n>0)c[i+1]+=n;
}
for(l=(z(lc)-1);(c[l]==0)&&(l>0);l--);
for(int i=l+1;i>0;cout<<c[--i]);
delete [] a;
delete [] b;
delete [] c;
return 0;
}
我是想精确到10000位。 展开
#include <iostream>
#include <cstdlib>
#include <string>
#include <cmath>
#include <memory.h>
using namespace std;
int val(string s)
{
return (atoi(s.c_str()));
}
int s2n(string s,int *n)
{
for(int i=s.size(),j=-1;;)
{
if(i<4)
{
n[++j]=val(s.substr(0,i));
break;
}
else
{
i-=4;
n[++j]=val(s.substr(i,4));
}
}
return 0;
}
int z(int n)
{
return ((n-1)/4+1);
}
int main()
{
string s;
int n,l,la,lb,lc;
getline(cin,s);
la=s.size();
int *a=new int [z(la)];
memset(a,0,z(la)*sizeof(int));
s2n(s,a);
getline(cin,s);
lb=s.size();
int *b=new int [z(lb)];
memset(b,0,z(lb)*sizeof(int));
s2n(s,b);
lc=la+lb;
int *c=new int [z(lc)];
memset(c,0,z(lc)*sizeof(int));
for(int i=0;i<z(la);i++)
for(int j=0;j<z(lb);j++)
c[i+j]+=a[i]*b[j];
for(int i=0;i<z(lc);i++)
{
n=c[i]/10000;
c[i]%=10000;
if(n>0)c[i+1]+=n;
}
for(l=(z(lc)-1);(c[l]==0)&&(l>0);l--);
for(int i=l+1;i>0;cout<<c[--i]);
delete [] a;
delete [] b;
delete [] c;
return 0;
}
我是想精确到10000位。 展开
1个回答
展开全部
把for(int i=l+1;i>0;cout<<c[--i]);改成以下
cout.fill('0');
for(i=l+1;i>0;cout<<c[--i],cout.width(4));
cout << endl;
三句。
把int *a=new int [z(la)];、int *b=new int [z(lb)];、int *c=new int [z(lc)];分别改成
int *a=new int [z(la)+1];、int *b=new int [z(lb)+1];、int *c=new int [z(lc)+1];。
从乘法实现(就是双for和后面c[i+j]+=a[i]*b[j];)看,这代码还有逻辑错误:当数据较大时(比如200个9乘以200个9),连续4位的乘积将超限int的允许值而出错。改进办法是不要计算完了才处理进位——这里我没改,你自己先弄……
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询