C++中高精度计算的问题

C++中高精度计算的问题,第1张

精度运算一般是用数组来储存各位的数字,然后模拟手工算法来计算的直接用double型的精度是不够的。

这是我以前写的一个程序如果是02321的话就只输出2321

#include"iostream"

#include"string"

#include"vector"

using namespace std;

struct longfloat{

longfloat(){num=vector<short>(0);point=0;}

longfloat(int n){num=vector<short>(n,0);point=0;}

vector<short>num;

int point;

};

istream& operator>>(istream&sin,longfloat&r){

string s;

sin>>s;

rpoint=ssize()-1-sfind("",0);

rnum=vector<short>(0);

for(int i=ssize()-1;i>=0;i--){

if(s[i]!='')rnumpush_back(s[i]-'0');

}

return sin;

}

ostream& operator<<(ostream&sout,longfloat r){

while(rnum[rnumsize()-1]==0&&rnumsize()>rpoint)rnumpop_back();

int n=0;

while(rnum[n]==0)n++;

for(int i=rnumsize()-1,j=0;i>=n;i--,j++){

if(j==rnumsize()-rpoint)sout<<"";

sout<<rnum[i];

}

return sout;

}

longfloat operator(const longfloat&r1,const longfloat&r2){

longfloat tem(r1numsize()+r2numsize()-1);

tempoint=r1point+r2point;

for(int i=0;i<r1numsize();i++){

for(int j=0;j<r2numsize();j++){

temnum[i+j]+=r1num[i]r2num[j];

}

}

for(int i=0;i<temnumsize()-1;i++){

if(temnum[i]>=10){

temnum[i+1]+=temnum[i]/10;

temnum[i]%=10;

}

}

while(temnum[temnumsize()-1]>=10){

temnumpush_back(temnum[temnumsize()-1]/10);

temnum[temnumsize()-2]%=10;

}

return tem;

}

longfloat pow(longfloat r,int n)

{

longfloat tem=r;

for(int i=1;i<n;i++){

r=rtem;

}

return r;

}

int main()

{

longfloat r;

int n;

while(cin>>r>>n){

cout<<pow(r,n)<<endl;

}

}

精度的实现是需要用字符形数组和整形数组的配合来实现,下面的例子,是一道ACM试题,关于计算高精度的问题,是算a的b次方但如果a是整数的话,后面需要输入 a0空格b回车。可以计算21的5000次方 或者是20的9000次方

#include<stdioh>

#include<mathh>

int qq(int n)

{ int i, sum=1;

for(i=1;i<=n;i++)

sum=10sum;

return(sum);

}

int main()

{

float r;

int n;

while(1)

{

char a[10000];

long int b[10000];

int k,h,m,i,j,z,g,t,q,e;

long int c=0;

if(scanf("%s%d",a,&n)==EOF)break;

for(i=0;a[i];i++)

if(a[i]=='')k=i;

m=i-k-1;

for(i=k;i<k+m;i++)

a[i]=a[i+1];

h=i;

for(i=0;i<h;i++)

b[i]=a[i]-48;

for(i=0;i<h;i++)c=c10+b[i];

for(i=0;i<h/2;i++){ t=b[i];b[i]=b[h-1-i];b[h-1-i]=t;}

for(e=1;e<n;e++)

{

for(i=0;i<h;i++)b[i]=b[i]c;

for(j=0;j<h-1;j++)

if(b[j]>=10){t=b[j];b[j]=t%10;b[j+1]+=t/10; }

if(b[h-1]>=10)

{

t=b[h-1];

q=b[h-1];

z=1;

while(t>=10)

{

t=t/10;

z++;

}

g=z;

while(z>=1)

{

b[h+g-z-1]=q/qq(g-z)%10;

z--;

}

h=h+g-1;

}

}

if(h<mn)

{

printf("");

for(j=mn-1;j>h-1;j--)printf("0");

for(j=0; ;j++)if(b[j]!=0)break;

for(i=h-1;i>=j;i--)

printf("%d",b[i]);

}

if(h==mn)

{ for(j=0; ;j++)if(b[j]!=0)break;

printf("");

for(i=h-1;i>=j;i--)

printf("%d",b[i]);

}

if(h>mn)

{

for(j=0; ;j++)if(b[j]!=0)break;

if(j<mn-1&&b[h-1]==0)

{

printf("");

for(i=mn-1;i>=j;i--)printf("%d",b[i]);

}

if(j<=mn-1&&b[h-1]!=0)

{ for(i=h-1;i>=mn;i--)

printf("%d",b[i]);

printf("");

for(i=mn-1;i>=j;i--)printf("%d",b[i]);

}

if(j>=mn)

{

for(i=h-1;i>=mn;i--)

printf("%d",b[i]);

}

} printf("\n");

}

return 0;

}

高精度就是自己用数组做的数据类型,每一次加过之后要进行进位,再重新加。。我好久都没写了,就不给你具体些了。

[1][2][3]

+ [8]

---------

[1][2][11]

---------

[1][3][1]

过程就是这样的,这种是10进制的,还有万进制的,那种以后优化用得到!

以上就是关于C++中高精度计算的问题全部的内容,包括:C++中高精度计算的问题、用C语言编写程序实现大整数(精度数十位到几万位)的四则运算(加、减、乘、除)。、用pascal编一程序,用高精度运算,求n的累加和(1+2+3+...+n)的和等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9858666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存