高精度运算一般是用数组来储存各位的数字,然后模拟手工算法来计算的直接用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)的和等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)