?? 高精度運算.cpp
字號:
//高精度運算
//--------------------------------
#include<iostream>
#include<string>
#include<fstream>
#include<algorithm>
using namespace std;
// --------------------------------------------
int str_compare(string a,string b) //(1表示a>b, 0表示a=b, -1表示a<b)
{
int rtn;
int aLen=a.length();
int bLen=b.length();
if(aLen>bLen)
rtn=1;
else
if(aLen<bLen)
rtn=-1;
else
{
if(a==b)
rtn=0 ;
else
if(a>b)
rtn=1;
else
if(a<b)
rtn=-1;
}
return rtn;
}
// -------------------------------------------------
string str_add(string a,string b) //計算a+b
{
string c,c1;
int p,q;
int i;
int tmp;
bool flag;
if(a.length()<b.length())
swap(a,b);
p=a.length()-1;
q=b.length()-1;
flag=false;
while(q>=0)
{
tmp=a[p--]+b[q--]-96;
if(flag)
tmp++;
flag=false;
if(tmp>=10)
{
tmp-=10;
flag=true;
}
c+=char(tmp+48);
}
while(p>=0)
{
tmp=a[p--]-48;
if(flag)
tmp++;
flag=false;
if(tmp>=10)
{
tmp-=10;
flag=true;
}
c+=char(tmp+48);
}
if(flag)
c+='1';
for(i=c.length()-1;i>=0;i--)
c1+=c[i];
return c1;
}
//-----------------------------------------
string str_minus(string a,string b) //計算a-b(a=b時沒有輸出任何數?)
{
string str,rtn;
int i;
bool sign=true;
if(a<b)
{
swap(a,b);
sign=false;
}
int p=a.length()-1;
int q=b.length()-1;
while(q>=0)
{
if(a[p]<b[q])
{
str+=char(a[p]-b[q]+58);
a[p-1]--;
}
else
str+=char(a[p]-b[q]+48);
p--;
q--;
}
while(p>=0)
{
if(a[p]<'0')
{
str+=char(a[p]+10);
a[p-1]--;
}
else
str+=a[p];
p--;
}
i=str.length()-1;
while(str[i]=='0')
i--;
for(;i>=0;i--)
rtn+=str[i];
if(rtn.length()==0)
str+='0';
if(sign)
return rtn;
else
return "-" + rtn;
}
//----------------------------------------------------
string str_multiply(string a,string b) //計算a*b
{
if( str_compare(a,b)==-1)
swap(a,b);
string c,c1;
string bb=b,aa=a;
int i,j,k,bit;
int p;
int tmp;
p=bb.length()-1;
for(i=0;i<b.length();i++)
b[i]=bb[p--];
p=aa.length()-1;
for(i=0;i<a.length();i++)
a[i]=aa[p--];
for(i=0;i<b.length();i++)
{
bit=0;
for(j=0;j<a.length();j++)
{
if(i+j>= c.length())
tmp=(b[i]-48)*(a[j]-48)+bit;
else
tmp=(b[i]-48)*(a[j]-48)+bit+(c[i+j]-48);
bit=tmp/10;
tmp=tmp%10;
if(i+j>=c.length())
c+=char(tmp+48);
else
c[i+j]=char(tmp+48);
}
if(bit>0)
{
k=i+j;
if(k>=c.length())
c+=char(bit+48);
else
{
while(bit!=0)
{
tmp=bit+(c[k]-48);
bit=tmp/10;
tmp=tmp%10;
if(k>=c.length())
c+=char(tmp+48);
else
c[k++]=char(tmp+48);
}
}
}
}
for(i=c.length()-1;i>=0;i--)
c1+=c[i];
return c1;
}
//-------------------------------------------------------- a < b 精確到100位
string str_divide(string a,string b) //計算a/b (除法操作有問題)
{
string c;
string y,tmp,tmp3;
int i;
int flag;
int last;
if(str_compare(a,b)==1)
swap(a,b);
a+='0';
for(i=0;i<100;i++)
{
if(str_compare(a,b)==-1)
{
a+='0';
c+='0';
}
else
{
c+='1';
last=c.length()-1;
tmp=b;
tmp3=str_minus(a,tmp);
while(str_compare(tmp3,b)!=-1)
{
tmp=str_add(tmp,b);
c[last]++;
tmp3=str_minus(a,tmp);
}
if(str_compare(tmp3,"0")==0)
break;
a=tmp3;
a+='0';
}
}
return c;
}
//-----------------------------------
void main()
{
ifstream in("abc.txt");
ofstream out("x.txt");
string a,b;
in>>a>>b;
cout<<a<<endl<<b<<endl;
cout<<str_compare(a,b)<<endl;
cout<<str_minus(a,b)<<endl;
cout<<str_add(a,b)<<endl;
cout<<str_multiply(a,b)<<endl;
cout<<a<<endl<<b<<endl;
//cout<<str_divide(a,b)<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -