2.8总结
看过一个acm高手的博客,说要总结常用模板练到写时不用想,今天结束基本算法大数(高精度)的学习,明天码题
转载大数模板,自己慢慢理解
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int base = 10000;//万进制所以是10000
const int width = 4; //最大是9999四位数
const int N = 1000; //最大数字是10000的1000次方
class dashu{
public:
int ln;
int v[N];
dashu(int r = 0){
int i;
for(i=0;r>0;r/=base){
v[i++]=r%base;
}
ln=i;
}
friend bool operator < (const dashu& a,const dashu& b);
friend bool operator <= (const dashu& a,const dashu& b);
friend dashu operator+ (const dashu& a,const dashu& b);
friend dashu operator- (const dashu& a,const dashu& b);
friend dashu operator* (const dashu& a,const dashu& b);
friend dashu operator/ (const dashu& a,const dashu& b);
friend void write(const dashu& v);
friend int digit(const dashu& a);
friend bool read(const dashu& b,char buf[]);
dashu& operator = (const dashu& r){
memcpy(this,&r,(r.ln+1)*sizeof(int));
return *this;
}
};
bool operator < (const dashu& a,const dashu& b){
int i;
if(a.ln!=b.ln) return a.ln<b.ln;
for(i=a.ln-1;i>=0&&a.v[i]==b.v[i];i--);
return i<0?0:a.v[i]<b.v[i];
}
bool operator <= (const dashu& a,const dashu& b)
{
return !(b<a);
}
dashu operator+ (const dashu& a,const dashu& b){
dashu res;
int i,cy=0;
for(i=0;i<a.ln||i<b.ln;i++){
if(i<a.ln) cy+=a.v[i];
if(i<b.ln) cy+=b.v[i];
res.v[i]=cy%base;
cy/=base;
}
if(cy){
res.ln=i+1;
res.v[res.ln-1]=cy;
}
else
res.ln=i;
return res;
}
dashu operator -(const dashu &a,const dashu& b){
dashu res;int i,cy=0;
for(res.ln=a.ln,i=0;i<res.ln;i++){
res.v[i]=a.v[i]-cy;
if(i<b.ln) res.v[i]-=b.v[i];
if(res.v[i]<0){cy=1;res.v[i]+=base;}
else cy=0;
}
while(res.ln>0 && res.v[res.ln-1]==0) res.ln--;
return res;
}
dashu operator * (const dashu& a,const dashu& b){
dashu res;res.ln=0;
if(0==b.ln) { res.v[0]=0;return res;}
int i,j,cy;
for(i=0;i<a.ln;i++){
for(j=cy=0;j<b.ln||cy>0;j++,cy/=base){
if(j<b.ln) cy+=a.v[i]*b.v[j];
if(i+j<res.ln) cy+=res.v[i+j];
if(i+j>=res.ln) res.v[res.ln++]=cy%base;
else res.v[i+j]=cy%base;
}
}
return res;
}
dashu operator /(const dashu& a,const dashu& b){
dashu mod,tem,res;
int i,lf,rg,mid;
mod.v[0]=mod.ln=0;
for(i=a.ln-1;i>=0;i--){
mod=mod*base+a.v[i];
for(lf = 0,rg=base-1;lf<rg;){
mid=(lf+rg+1)/2;
if(b*mid<=mod) lf=mid;
else rg=mid-1;
}
res.v[i]=lf;
mod=mod-b*dashu(lf);
}
res.ln=a.ln;
int t=0;
while(res.ln>0&&res.v[res.ln-1]==0)
res.ln--;
for(int i=0;i<res.ln;i++)
res.v[i]=res.v[i+t];
return res;
//return mod;
}
int digit(dashu &a){
if(a.ln==0) return 0;
int l=(a.ln-1)*4;
for(int t=a.v[a.ln-1]; t ;l++,t/=10);
return l;
}
bool read(dashu& b,char buf[]){//将字符串数组变为大数
cin>>buf;
int ln=strlen(buf);
memset(&b,0,sizeof(dashu));
b.ln=ln/4+1;
int t=0;
for(int i=ln-1;i>=0;i=i-4){
int n=0;
int j=i-3;
if(j<0){
j=0;
}
while(j<=i){
n=n*10+(buf[j++]-'0');
}
b.v[t++]=n;
}
return 1;
}
void write(const dashu& v){ //输出大数
int i;
printf("%d",v.ln==0?0:v.v[v.ln-1]);
for(i=v.ln-2;i>=0;i--)
printf("%04d",v.v[i]);
cout<<endl;
}
int main()
{
dashu a,b,c;
a.ln=1;
a.v[0]=1;
b.ln=2;
b.v[0]=1111;
b.v[1]=1;
c=a+b;
write(a);
write(b);
write(c);
return 0;
}
转载自https://blog.****.net/qq_30346729/article/details/77851964
刷过一章网课,今天结束卷积神经网络的网课
感觉看多了理论不练没用,看得多做得少,还是从基础题开始慢慢做。明天刷十道基础题,立个flag。