【高精度加法】
洛谷 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;
}