二分查找+3个高精度

二分查找:

模版

值域在1-n

int find(int x){

int l=0,r=n+1;

int res=0;

while(l<=r){

if(a[mid]

else {

r=mid-1;

ans=mid;

}

}

return ans;

}

例题:
给定一个按照升序排列的长度为 nn 的整数数组,以及 qq 个查询。

对于每个查询,返回一个元素 kk 的起始位置和终止位置(位置从 00 开始计数)。

如果数组中不存在该元素,则返回 -1 -1。

输入格式

第一行包含整数 nn 和 qq,表示数组长度和询问个数。

第二行包含 nn 个整数(均在 1∼100001∼10000 范围内),表示完整数组。

接下来 qq 行,每行包含一个整数 kk,表示一个询问元素。

输出格式

共 qq 行,每行包含两个整数,表示所求元素的起始位置和终止位置。

如果数组中不存在该元素,则返回 -1 -1。

代码:

#include

using namespace std;

const int N=100010;

int a[N];

int n,m;

int find1(int x){

    int l=0,r=n+1;

    int ans=0;

    while(l<=r){

        int mid=(l+r)>>1;

        if(a[mid]>x){

            r=mid-1;

        }

        else if(a[mid]==x){

            ans=mid;

            r=mid-1;

        }else if(a[mid]

            l=mid+1;

        }

    }

    return ans;

}

int find2(int x){

    int l=0,r=n+1;

    int ans=0;

    while(l<=r){

        int mid=(l+r)>>1;

        if(a[mid]>x){

            r=mid-1;

        }

        else if(a[mid]==x){

            ans=mid;

            l=mid+1;

        }else if(a[mid]

            l=mid+1;

        }

    }

    return ans;

}

int main(){

    cin>>n>>m;

    for(int i=1;i<=n;i++){

        cin>>a[i];

    }

    while(m--){

        int tmp;

        cin>>tmp;

        cout<

    }

    return 0;    

}

高精度算法:

加法:

将两个数倒置,做进位加法就可以了

#include

using namespace std;

string a,b;

string add(string a,string b){

    if(a.size()

    int n=a.size();

    int m=b.size();

    vector p1,p2;

    for(int i=n-1;i>=0;i--){

        int c=a[i]-'0';

        p1.push_back(c);

    }

    for(int i=m-1;i>=0;i--){

        int c=b[i]-'0';

        p2.push_back(c);

    }

    

    vector ans;

    //转换成数组

    int c=0;//进位

    for(int i=0;i

        int tmp=p1[i]+c;

        if(i

        c=tmp/10;

        ans.push_back(tmp%10);

    }

    if(c)ans.push_back(c);

    string res;

    for(int i=ans.size()-1;i>=0;i--){

        res+=(char)(ans[i]+'0');

    }

    return res;

}

int main(){

    cin>>a>>b;

    cout<

}

高精度减法:

先判断大小,然后再相减即可:

#includeusing namespace std;bool cmp(string a,string b){

    if(a.size()>b.size())return 1;

    if(a.size()

    int n=a.size();

    for(int i=0;i

        if(a[i]

        else if(a[i]>b[i])return 1;

    }

    return 1;

}string sub(string a,string b){

    int f=0;

    if(!cmp(a,b)){

        f=1;

        swap(a,b);

    }

    vector p1,p2;

    int n,m;

    n=a.size(),m=b.size();

    for(int i=n-1;i>=0;i--){

        p1.push_back(a[i]-'0');

    }

    for(int i=m-1;i>=0;i--){

        p2.push_back(b[i]-'0');

    }

    int lend=0;

    vector ans;

    for(int i=0;i

        int tmp=p1[i]-lend;

        if(i

        if(tmp<0){

            lend=1;

            tmp+=10;

        }

        else lend=0;

        ans.push_back(tmp);

    }

    while(ans.size()!=1){

        if(ans.back()==0)ans.pop_back();

        else break;

    }

    string res;

    if(f)res+='-';

    for(int i=ans.size()-1;i>=0;i--){

        res+=(char)(ans[i]+'0');

    }

    return res;   

}int main(){

    string a,b;

    cin>>a>>b;

    cout<

}

高精度乘法:

#include

using namespace std;

string mul(string a,string b){

    vectorp1,p2,ans;

    int n=a.size(),m=b.size();

    for(int i=n-1;i>=0;i--){

        p1.push_back(a[i]-'0');

    }

    for(int i=m-1;i>=0;i--){

        p2.push_back(b[i]-'0');

    }

    ans=vector (n+m,0);

    for(int i=0;i

        int c=0;

        int p=p1[i];

        for(int j=0;j

            int tmp=p*p2[j]+c+ans[i+j];

            if(tmp>=10)c=tmp/10;

            else c=0;

            ans[i+j]=tmp%10;

        }

        p=i+m;

        while(c){

            ans[p]=ans[p]+c;

            c=ans[p]/10;

            ans[p]%=10;

            p++;

        }

    }

    string res;

    int f=1;

    for(int i=ans.size()-1;i>=0;i--){

        if(f&&ans[i]==0){

            continue;

            

        }

        else f=0;

        res+=(char)(ans[i]+'0');

    }

    if(f)return "0";

    return res;

    

}

int main(){

    string a,b;

    cin>>a>>b;

    cout<

}

高精度除法:

你可能感兴趣的:(算法学习,刷题,r语言,算法,c++)