[REVIEW] 高精度模板

【高精度加法】
洛谷 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值