我现在很需要C++版的高精度减法、乘法、除法的源程序,希望一些C++高手可以帮帮忙!拜托咯……
展开全部
你是要解决大小数问题吧,呵呵,如果你有,记得发我一份,我前一阵子工作上碰到了,本来想自己写一个,后来我同事都在劝我说那个东西不好做。
JAVA有解决这个问题的Big decimal库,不过C++没有。
我只说一下思路,就是将double变为足够大的整数, 这个整数得你自己定义吧(自定义这种类型的+-*/),像windows API中的__int128类型都不够,我想如果自己做应该自己先写个算法确定出能够满足运算的那个整数,例如1.23434354646546565656565/XXXX, 你得根据这两个数的精度做一个变换,将第一个数变换成一个类似于INT型的123434354646546565656565, 甚至是12343435464654656565656500000000000(前提你知道补零的那一位在原double中已经不精确,没有意义了),然后把XXXX也转过去做整数除法,最后再把结果的整数转回到double上来。
呵呵,反正不是很好做,maple 和 matlib里面的这个做的不错, 记得找到了发我一份哦!
最野蛮的方法就是申请足够大的内存块然后慢慢移位吧。
JAVA有解决这个问题的Big decimal库,不过C++没有。
我只说一下思路,就是将double变为足够大的整数, 这个整数得你自己定义吧(自定义这种类型的+-*/),像windows API中的__int128类型都不够,我想如果自己做应该自己先写个算法确定出能够满足运算的那个整数,例如1.23434354646546565656565/XXXX, 你得根据这两个数的精度做一个变换,将第一个数变换成一个类似于INT型的123434354646546565656565, 甚至是12343435464654656565656500000000000(前提你知道补零的那一位在原double中已经不精确,没有意义了),然后把XXXX也转过去做整数除法,最后再把结果的整数转回到double上来。
呵呵,反正不是很好做,maple 和 matlib里面的这个做的不错, 记得找到了发我一份哦!
最野蛮的方法就是申请足够大的内存块然后慢慢移位吧。
展开全部
高精度的加法
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void read(string s,int *a,int j)
{
char c[100];
int l=0;
for (int i=j;i>=0;i--)
{
c[i]=s[l];
l++;
}
char q;
for (int i=1;i<j+1;i++)
{
q=c[i];
a[i]=static_cast<int>(q)-48;
}
a[0]=0;
return;
}
void inc(int *a,int *b,int *c,int j,int p)
{
ofstream fout;
if (j>p)
{
for (int i=p+1;i<=j+1;i++)
{
b[i]=0;
}
}
else
{
for (int i=j+1;i<=p+1;i++)
{
a[i]=0;
}
j=p;
}
p=0;
for (int i=0;i<=j+1;i++)
{
c[i]=((a[i]+b[i]) + p) % 10;
p=(a[i]+b[i]+p) / 10;
}
fout.open("hd.out");
if (c[j+1]!=0)
{
fout<<c[j+1];
}
for (int i=j;i>0;i--)
{
fout<<c[i];
}
return;
}
int main()
{
ifstream fin;
ofstream fout;
fin.open("hd.in");
int a[100]={0};
int b[100]={0};
int c[100]={0};
int j,p,m;
string s;
fin>>s;
j=s.length();
read(s,a,j);
fin>>s;
p=s.length();
read(s,b,p);
fin.close();
inc(a,b,c,j,p);
fout.close();
system("pause");
return 0;
}
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void read(string s,int *a,int j)
{
char c[100];
int l=0;
for (int i=j;i>=0;i--)
{
c[i]=s[l];
l++;
}
char q;
for (int i=1;i<j+1;i++)
{
q=c[i];
a[i]=static_cast<int>(q)-48;
}
a[0]=0;
return;
}
void inc(int *a,int *b,int *c,int j,int p)
{
ofstream fout;
if (j>p)
{
for (int i=p+1;i<=j+1;i++)
{
b[i]=0;
}
}
else
{
for (int i=j+1;i<=p+1;i++)
{
a[i]=0;
}
j=p;
}
p=0;
for (int i=0;i<=j+1;i++)
{
c[i]=((a[i]+b[i]) + p) % 10;
p=(a[i]+b[i]+p) / 10;
}
fout.open("hd.out");
if (c[j+1]!=0)
{
fout<<c[j+1];
}
for (int i=j;i>0;i--)
{
fout<<c[i];
}
return;
}
int main()
{
ifstream fin;
ofstream fout;
fin.open("hd.in");
int a[100]={0};
int b[100]={0};
int c[100]={0};
int j,p,m;
string s;
fin>>s;
j=s.length();
read(s,a,j);
fin>>s;
p=s.length();
read(s,b,p);
fin.close();
inc(a,b,c,j,p);
fout.close();
system("pause");
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
高精度乘法
#include<cstdio>
#include<cstdlib>
#include<cstring>
struct hp{int len,a[10000];};
hp x,y,z;
int main()
{
char s[1000];
scanf("%s",s);
x.len=strlen(s);
for(int i=0;i<x.len;i++)
x.a[i]=s[x.len-i-1]-'0';
scanf("%s",s);
y.len=strlen(s);
for(int i=0;i<y.len;i++)
y.a[i]=s[y.len-i-1]-'0';
memset(z.a,0,sizeof(z.a));
z.len=x.len+y.len-1;
for(int i=0;i<x.len;i++)
for(int j=0;j<y.len;j++)
{
z.a[i+j]=x.a[i]*y.a[j]+z.a[i+j];
z.a[i+j+1]=z.a[i+j+1]+z.a[i+j]/10;
z.a[i+j]=z.a[i+j]%10;
}
if(z.a[z.len]!=0) z.len++;
while(z.len>1 && z.a[z.len-1]==0) z.len--;
for (int i=z.len-1;i>=0;i--)
printf("%d",z.a[i]);
//system("pause");
}
C语言的
#include<cstdio>
#include<cstdlib>
#include<cstring>
struct hp{int len,a[10000];};
hp x,y,z;
int main()
{
char s[1000];
scanf("%s",s);
x.len=strlen(s);
for(int i=0;i<x.len;i++)
x.a[i]=s[x.len-i-1]-'0';
scanf("%s",s);
y.len=strlen(s);
for(int i=0;i<y.len;i++)
y.a[i]=s[y.len-i-1]-'0';
memset(z.a,0,sizeof(z.a));
z.len=x.len+y.len-1;
for(int i=0;i<x.len;i++)
for(int j=0;j<y.len;j++)
{
z.a[i+j]=x.a[i]*y.a[j]+z.a[i+j];
z.a[i+j+1]=z.a[i+j+1]+z.a[i+j]/10;
z.a[i+j]=z.a[i+j]%10;
}
if(z.a[z.len]!=0) z.len++;
while(z.len>1 && z.a[z.len-1]==0) z.len--;
for (int i=z.len-1;i>=0;i--)
printf("%d",z.a[i]);
//system("pause");
}
C语言的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实很好做:
const n=150;
var t,s1,s2:string;
a,b,c:array[1..n] of integer;
i,j,jw:integer;
begin
readln(s1);
readln(s2);
if (length(s1) < length(s2)) or (length(s1)=length(s2)) and (s1<s2) then
begin
t:=s1;s1:=s2;s2:=t;
end;
for i:=1 to length(s1) do
a[length(s1)-i+1]:=ord(s1[i])-48;
for i:=1 to length(s2) do
b[length(s2)-i+1]:=ord(s2[i])-48;
jw:=0;
for i:=1 to n do
begin
if a[i]<b[i]+jw then
begin c[i]:=a[i]+10-b[i]-jw;
jw:=1;
end
else
begin c[i]:=a[i]-b[i]-jw;
jw:=0;
end;
end;
i:=n;
while c[i]=0 do i:=i-1;
for j:=i downto 1 do
write(c[j]);
end.
采纳我的把!!
const n=150;
var t,s1,s2:string;
a,b,c:array[1..n] of integer;
i,j,jw:integer;
begin
readln(s1);
readln(s2);
if (length(s1) < length(s2)) or (length(s1)=length(s2)) and (s1<s2) then
begin
t:=s1;s1:=s2;s2:=t;
end;
for i:=1 to length(s1) do
a[length(s1)-i+1]:=ord(s1[i])-48;
for i:=1 to length(s2) do
b[length(s2)-i+1]:=ord(s2[i])-48;
jw:=0;
for i:=1 to n do
begin
if a[i]<b[i]+jw then
begin c[i]:=a[i]+10-b[i]-jw;
jw:=1;
end
else
begin c[i]:=a[i]-b[i]-jw;
jw:=0;
end;
end;
i:=n;
while c[i]=0 do i:=i-1;
for j:=i downto 1 do
write(c[j]);
end.
采纳我的把!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你上网找一下浙大模板就有
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询