[REVIEW] 高精度模板

来源:互联网 发布:用友软件版本介绍 编辑:程序博客网 时间:2024/05/18 12:41

【高精度加法】
洛谷 P1255 数楼梯

//数楼梯(高精度加法模板) #include<iostream>#include<cstdio>#include<cstring>#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;int a[100005],b[100005],c[100005];int main(){    int i,j,n;    scanf("%d",&n);    if(n==0) {printf("0\n");return 0;}     if(n==1) {printf("1\n");return 0;}     if(n==2) {printf("2\n");return 0;}     a[0]=a[1]=b[0]=1,b[1]=2;    fo(j,3,n)    {        memset(c,0,sizeof c);        c[0]=max(a[0],b[0]);        fo(i,1,b[0])        {            c[i]+=a[i]+b[i];            c[i+1]+=c[i]/10;            c[i]%=10;        }        if(c[c[0]+1]) c[0]++;        fo(i,0,b[0]) a[i]=b[i];        fo(i,0,c[0]) b[i]=c[i];    }    for(i=c[0];i;i--) printf("%d",c[i]);    printf("\n");     return 0;} 

【n进制高精度】

题目描述

话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球。因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用B(2<=B<=36)进制计数。星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成B进制加法的计算器给他们。 现在小Z希望你可以帮助他,编写实现B进制加法的程序。
输入输出格式
输入格式:

共3行第1行:一个十进制的整数,表示进制B。第2-3行:每行一个B进制数正整数。数字的每一位属于{0,1,2,3,4,5,6,7,8,9,A,B……},每个数字长度<=2000位。

输出格式:

一个B进制数,表示输入的两个数的和。

输入输出样例
输入样例#1:

4
123
321

输出样例#1:

1110

//数楼梯(高精度加法模板) #include<iostream>#include<cstdio>#include<cstring>#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const char* output="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";int a[100005],b[100005],c[100005];char x[100005],y[100005]; inline int change(char p){    if(p>='A'&&p<='Z') return p-'A'+10;    else return p-'0';}int main(){    int i,j,n;    scanf("%d",&n);  //进制    scanf("%s",x+1);    scanf("%s",y+1);    a[0]=strlen(x+1),b[0]=strlen(y+1);    fo(i,1,a[0])      a[i]=change(x[a[0]-i+1]);    fo(i,1,b[0])      b[i]=change(y[b[0]-i+1]);    c[0]=max(a[0],b[0]);    fo(i,1,c[0])    {        c[i]+=a[i]+b[i];        c[i+1]+=c[i]/n;        c[i]%=n;    }    if(c[c[0]+1]) c[0]++;    for(i=c[0];i;i--) printf("%c",output[c[i]]);    printf("\n");     return 0;} 

【高精*单精 && 高精/单精】
NOIP 2012 国王游戏

这道题告诉了我们对拍的重要性(没对拍只A了一个点,拍一拍就找见错了)

//king#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mxn=1005;int n;int mul[1000005],ans[1000005],tmp[1000005];struct node {int lef,rig;} a[mxn];inline bool comp(node x,node y) {return x.lef*x.rig<y.lef*y.rig;}inline void multi(int x){    int i,j,k;    memset(tmp,0,sizeof tmp);    tmp[0]=mul[0];    fo(i,1,mul[0])    {        fo(i,1,mul[0])          tmp[i]=mul[i]*x;        fo(i,1,mul[0])          tmp[i+1]+=tmp[i]/10,tmp[i]%=10;        tmp[0]++;        while(tmp[tmp[0]]) tmp[tmp[0]+1]+=tmp[tmp[0]]/10,tmp[tmp[0]]%=10,tmp[0]++;        while(!tmp[tmp[0]]) tmp[0]--;        fo(i,0,tmp[0]) mul[i]=tmp[i];    }}inline void chu(int x){    int i,j,now=0;    memset(tmp,0,sizeof tmp);    tmp[0]=mul[0];    for(i=mul[0];i;i--)    {         now=now*10+mul[i];         if(now<x) continue;         tmp[i]=now/x;         now=now%x;    }    while(!tmp[tmp[0]] && tmp[0]) tmp[0]--;    if(tmp[0]<ans[0]) return;    if(tmp[0]==ans[0])    {        bool flag=0;        for(i=tmp[0];i;i--)        {            if(tmp[i]>ans[i]) {flag=1;break;}            if(tmp[i]>ans[i]) {flag=0;break;}        }        if(!flag) return;        fo(i,0,tmp[0]) ans[i]=tmp[i];    }    else fo(i,0,tmp[0]) ans[i]=tmp[i];}int main(){//  freopen("rand.txt","r",stdin);//  freopen("king.txt","w",stdout);    int i,j,l,r;    scanf("%d%d%d",&n,&l,&r);    while(l) mul[++mul[0]]=l%10,l/=10;     fo(i,1,n) scanf("%d%d",&a[i].lef,&a[i].rig);    sort(a+1,a+n+1,comp);    fo(i,1,n)     {        chu(a[i].rig);        multi(a[i].lef);    }    for(i=ans[0];i;i--) printf("%d",ans[i]);    if(ans[0]==0) printf("0");    printf("\n");    return 0;}
1 0
原创粉丝点击