說明 嚴格意義上這個純模版不算原創,但是已經是理解整理後的 (加入我的代碼風格) 因為當時開了好幾個網頁,找不到參考 (包括但不限於高精度演算法( =4),n進位轉m進位( =2),c++重載運算符( =3)) 了, 如果原作者 (內容主要是來自那個模版) 看到,可以聯繫我,我會在開頭加入參考鏈接 適 ...
高精度重載
說明
嚴格意義上這個純模版不算原創,但是已經是理解整理後的 (加入我的代碼風格)
因為當時開了好幾個網頁,找不到參考 (包括但不限於高精度演算法(>=4),n進位轉m進位(>=2),c++重載運算符(>=3)) 了,如果原作者 (內容主要是來自那個模版) 看到,可以聯繫我,我會在開頭加入參考鏈接.
含適用於k進位的演算法.
可能有空時用string改寫(可以省去已經在庫中重載過的部分).
原始模版
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int ma=100;//數據位數
//求階乘
struct bu
{
int a[ma],len;
void ti(){while(len>1&&!a[len-1]) len--;}//清除多餘的零
bu() {memset(a,0,sizeof(a));len=1;}//初始化
bu(const int num){*this=num;}//*this是一個關鍵字,但是在某些編輯器下不顯示而已
bu(const char *num){*this=num;}
bu operator =(const char*num)
{
memset(a,0,sizeof(a));
len=strlen(num);
for(int i=0;i<len;i++)
a[i]=num[len-1-i]-'0';
ti();
return *this;
}
bu operator =(const int num)
{
char c[20];sprintf(c,"%d",num);
*this=c;
return *this;
}
bu operator + (const bu &c)
{
int i;bu b=*this;
for(i=0;i<c.len;i++)
{
b.a[i]+=c.a[i];
if(b.a[i]>9){b.a[i]%=10;b.a[i+1]++;}
}
while(b.a[i]>9){b.a[i++]%=10;b.a[i]++;}
b.len=max(len,c.len);
if(b.a[i]&&b.len<i+1) b.len=i+1;
return b;
}
bu operator - (const bu &c)
{
bu b=*this;int i;
for(i=0;i<c.len;i++)
{
b.a[i]-=c.a[i];
if(b.a[i]<0){b.a[i]+=10;b.a[i+1]--;}
}
while(b.a[i]<0){b.a[i++]+=10;b.a[i]--;}
b.ti();
return b;
}
bu operator * (const bu &c)const{
int i,j;bu b;b.len=len+c.len;
for(i=0;i<c.len;i++)
for(j=0;j<len;j++)
b.a[i+j]+=a[j]*c.a[i];
for(i=0;i<b.len-1;i++)
b.a[i+1]+=b.a[i]/10,b.a[i]%=10;
b.ti();
return b;
}
bu operator / (const bu &c){
int i,j;bu b=*this,d=0;
for(i=len-1;i>=0;i--)
{
d=d*10+a[i];
for(j=0;j<10;j++)
if(d<c*(j+1)) break;
b.a[i]=j;
d=d-c*j;
}
b.ti();
return b;
}
bu operator % (const bu &c){
int i,j;bu d=0;
for(i=len-1;i>=0;i--)
{
d=d*10+a[i];
for(j=0;j<10;j++)
if(d<c*(j+1)) break;
d=d-c*j;
}
return d;
}
bu operator += (const bu&c)
{
*this=*this+c;
return *this;
}
bool operator < (const bu &c)const{
if(len!=c.len) return len<c.len;
for(int i=len-1;i>=0;i--)
if(a[i]!=c.a[i]) return a[i]<c.a[i];
return false;
}
bool operator > (const bu &c)const{return c<*this;}
bool operator <= (const bu &c)const{return !(c<*this);}
bool operator >= (const bu &c)const{return !(*this<c);}
bool operator != (const bu &c)const{return c<*this||*this<c;}
bool operator == (const bu &c)const{return !(c<*this||*this<c);}
string str()
{
char c[ma]={};
for(int i=0;i<len;i++)
c[len-1-i]=a[i]+'0';
return c;
}
};//重載運算符報錯時可能是漏了';'
istream& operator >> (istream& in, bu& x)//重載cin>>
{
string s;
in >> s;
x = s.c_str();
return in;
}
ostream& operator << (ostream& out, bu& x)//重載cout<<
{
out << x.str();
return out;
}
int main()
{
int n;cin>>n;
bu x=1,y=0;
for(int i=1;i<=n;i++)
{
x=x*i;
y+=x;
}
cout<<y;
return 0;
}
洛谷P1015
求出現迴文數的次數 (每次反過來加)
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int ma=2000;
int n;//n進位
struct bu
{
int a[ma],len;
void ti(){while(len>1&&!a[len-1]) len--;}
bu() {memset(a,0,sizeof(a));len=1;}
bu(const int num){*this=num;}
bu(const char *num){*this=num;}
bu operator =(const char*num)
{
memset(a,0,sizeof(a));
len=strlen(num);
for(int i=0;i<len;i++)
{
if(num[len-1-i]<'A') a[i]=num[len-1-i]-'0';
else a[i]=num[len-1-i]-'A'+10;
}
ti();
return *this;
}
bu operator =(const int num)
{
char c[22];sprintf(c,"%d",num);
*this=c;
return *this;
}
bu operator -=(const bu&c)
//這裡是定義-=表示這個數反過來,即:
//例:c=78 則*this=87
{
len=c.len;
for(int i=0;i<c.len;i++)
a[c.len-i-1]=c.a[i];
ti();
return *this;
}
bu operator + (const bu &c)
{
int i;bu b=*this;
for(i=0;i<c.len;i++)
{
b.a[i]+=c.a[i];
if(b.a[i]>(n-1)){b.a[i]%=n;b.a[i+1]++;}
}
while(b.a[i]>(n-1)){b.a[i++]%=n;b.a[i]++;}
b.len=max(len,c.len);
if(b.a[i]&&b.len<i+1) b.len=i+1;
return b;
}
bu operator += (const bu&c)
{
*this=*this+c;
return *this;
}
string str()
{
char c[ma]={};
for(int i=0;i<len;i++)
c[len-1-i]=a[i]+'0';
return c;
}
};
istream& operator >> (istream& in, bu& x)
{
string s;
in >> s;
x = s.c_str();
return in;
}
bool ju(bu t)
{
for(int i=0;i<t.len;i++)
{
if(t.a[i]!=t.a[t.len-i-1])
return true;
}
return false;
}
int main()
{
cin>>n;
bu t1,t2;
char t3[101];
cin>>t3;
t1=t3;
int c=0;bool flag=ju(t1);
while(flag&&c<=30)
{
t2-=t1;//將t1反過來
t1+=t2;
c++;
flag=ju(t1);
}
if(flag||c>30) cout<<"Impossible!"<<endl;
else cout<<"STEP="<<c<<endl;
return 0;
}