大整数的构建
struct Bigint{
int fu;//表示数是否是负数
vector<int>s;
Bigint(){
fu=0;
}
Bigint(const Bigint& a){
this->s=a.s;
this->fu=a.fu;
}
Bigint(string str){
int dex=0;
if(str[0]=='-'){
this->fu=1;
dex++;
}else{
this->fu=0;
}
int num=0;
for(;dex<str.size();++dex){
int n=str[dex]-'0';
n=num+n;
if(n>9){
num=n/10;
n=n%10;
}
s.push_back(n);
}
reverse(s.begin(),s.end());//反转方便后面的运算
}
Bigint (long long num){
s.clear();
do{
s.push_back(num%10);
num/=10;
}while(num>0);
}
Bigint (int num){
s.clear();
do{
s.push_back(num%10);
num/=10;
}while(num>0);
}
};
大整数加法(仅考虑了正数相加)
Bigint operator + (Bigint a,Bigint b){
Bigint c;
int num=0;
for(int i=0;i<min(a.s.size(),b.s.size());++i){
int n=a.s[i]+b.s[i]+num;
if(n>9){
num=n/10;
n=n%10;
}else{
num=0;
}
c.s.push_back(n);
}
if(a.s.size()>b.s.size()){
for(int i=b.s.size();i<a.s.size();++i){
int n=a.s[i]+num;
if(n>9){
num=n/10;
n=n%10;
}else
{
num=0;
}
c.s.push_back(n);
}
}else{
for(int i=a.s.size();i<b.s.size();++i){
int n=b.s[i]+num;
if(n>9){
num=n/10;
n=n%10;
}else{
num=0;
}
c.s.push_back(n);
}
}
if(num!=0)
c.s.push_back(num);
return c;
}
void operator += (Bigint& a,Bigint& b){
a.s=(a+b).s;
}
大整数比较(先比较长度,在反向比较大小)
bool operator>(Bigint& a,Bigint& b){
if(a.s.size()>b.s.size()){
return true;
}else if(a.s.size()<b.s.size()){
return false;
}else{
int dex=a.s.size()-1;
while(dex!=0&&a.s[dex]==b.s[dex]){
dex--;
}
if(dex<=0)
return false;
if(a.s[dex]>b.s[dex]){
return true;
}else
return false;
}
}
bool operator ==(Bigint& a,Bigint& b){
if(a.s.size()!=b.s.size()){
return false;
}
else{
int dex=a.s.size()-1;
while(dex!=0&&a.s[dex]==b.s[dex]){
dex--;
}
if(dex<0)
return true;
else
return false;
}
}
bool operator<(Bigint &a,Bigint &b){
return b>a;
}
减法(与加法相同)
Bigint operator -(Bigint&a ,Bigint& b){
if(a<b){
Bigint c(b-a);
c.fu=1;
return c;
}
Bigint c;
int num=0;
for(int i=0;i<b.s.size();++i){
int n=a.s[i]-b.s[i]+num;
if(n<0){
num=-1;
n=10+n;
}else{
num=0;
}
c.s.push_back(n);
}
int dex=b.s.size();
for(;dex<a.s.size();++dex){
int n=a.s[dex]+num;
if(n<0){
num=-1;
n=10+n;
}else{
num=0;
}
c.s.push_back(n);
}
return c;
}
乘法(一个一个的数相乘,再相加)
Bigint operator*(Bigint a,Bigint b){
Bigint c("0");
for(int i=0;i<b.s.size();++i){
string s="";
int n=b.s[i];
int num=0;
for(int j=0;j<a.s.size();++j){
n=b.s[i]*a.s[j]+num;
if(n>9){
num=n/10;
n=n%10;
}else{
num=0;
}
s+=char(n+'0');
}
if(num!=0)
s+=char(num+'0');
reverse(s.begin(),s.end());
for(int j=0;j<i;++j){
s+="0";
}
Bigint tmp(s);
c+=tmp;
}
return c;
}
void operator*=(Bigint& a,Bigint& b){
a.s=(a*b).s;
}
输出(注意反向输出与前导0的问题)
ostream& operator << (ostream &out,const Bigint&x){
if(x.fu){
out<<'-';
}
int i=x.s.size()-1;
while(x.s[i]==0&&i>0){
i--;
}//去除前导0
for(;i>=0;--i){
out<<x.s[i];
}
return out;
}
-------------------------------------------------------------------------------
树的构建和打印
struct node {
int val;
node* left;
node* right;
node() {
val = 0;
left = NULL;
right = NULL;
}
};//树的构建
void treeprint(node* head, int lev) {
if (head == NULL) {
return;
}
treeprint(head->right, lev + 1);
for (int i = 0; i < lev; ++i) {
cout << "\t";
}
cout << head->val << endl;
treeprint(head->left, lev + 1);
}//打印树
树的三种遍历
void dfs(node* head) {
if (head == NULL) {
return;
}
//这里打印为先序(头左右)
dfs(head->left);
//这里为中序(左头右)
dfs(head->right);
//这里为后序(左右头)
}
树的横向遍历(宽度遍历)
1 void bfs(node* head) {
2 queue<node*>q;
3 q.push(head);
4 while (!q.empty()) {
5 node* tmp = q.front();
6 q.pop();
7 if (tmp->left != NULL) {
8 q.push(tmp->left);
9 }
10 if (tmp->right != NULL) {
11 q.push(tmp->right);
12 }
13 }
14 }
根据先序中序或后序中序来构建树
原理是先序第一个是头节点,可以在中序查找这个元素,那么以前就是左树,以后就是右树,可以根据递归构建
int in[N];//中序数组
int pre[N];//先序数组
node* creat(int inl, int inr, int prel, int prer) {
if (prer < prel||inl>inr) {
return NULL;
}
node* head = new node;
head->val = pre[prel];
int dex = 0;
//在中序中查找此元素(可以进行map优化快速查找)
for (; dex <= inr; ++dex) {
if (in[dex] == pre[prel])
break;
}
head->left = creat(inl, dex - 1, prel + 1, dex - prel + inl);
head->right = creat(dex + 1, inr, dex - prel + inl + 1, prer);
return head;
}
浙公网安备 33010602011771号