高精度模板

放几个高一上写的模板,高精除法什么的好像并没有什么用,写过板后就没用过了。

//Twenty
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=200000+100;
const int maxm=400000+100;
int m,n,x,y,q,flag;
int vis[maxn];
 
int read(){
    int n=0;char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')n=n*10+c-'0',c=getchar();
    return n;
}
 
int nxt[maxm],fir[maxn],to[maxm],ncnt;
void add_(int u,int v){
    nxt[++ncnt]=fir[u];fir[u]=ncnt;to[ncnt]=v;
    nxt[++ncnt]=fir[v];fir[v]=ncnt;to[ncnt]=u;
}
 
 
void dfs(int u){
    for(int i=fir[u];i;i=nxt[i]){
        int v=to[i];
        if(vis[v]) continue;
        for(int j=fir[v];j;j=nxt[j]){
            if(vis[to[j]]) continue;
            vis[to[j]]=1;dfs(to[j]);
        }
    }
    return;
}
 
int main()
{
    n=read();m=read();
    for(int i=1;i<=m;i++){
        int u,v;
        u=read();v=read();
        if(u==v)flag=1;
        else add_(u,v);
    }
    vis[1]=1;
    if(!flag) dfs(1);
    q=read();
    while(q--){
        x=read();y=read();
        if(x==y||flag){
            printf("Yes\n");
            continue;
        }
        else{
            if(vis[x]==vis[y]) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}
高精求阶乘和
//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream> 
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a[505],b,c[505];
char s[505];
int main()
{
    cin>>s;
    cin>>b;
    a[0]=strlen(s);
    for(int i=0;i<a[0];i++)
    a[i+1]=s[i]-'0';
    c[0]=a[0];
    int x=0;
    for(int i=1;i<=a[0];i++)
    {
        c[i]=(x*10+a[i])/b;
        x=(x*10+a[i])%b;
    }
    int l=1;
    while(l<c[0]&&c[l]==0)
    l++;
    for(int i=l;i<=c[0];i++)
    cout<<c[i];
    
}
高精除以低精
//Twenty
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a[505],b[505],c[505];
void read(int a[]) {
    char ch[505];
    int cd;
    cin>>ch;
    a[0]=strlen(ch);
    for(int i=0;i<a[0];i++)
    {
        a[i+1]=ch[a[0]-i-1]-'0';
    }
}
int compare(int a[],int b[]) {
    if(a[0]>b[0])return 1;
    if(a[0]<b[0])return -1;
    for(int i=a[0];i>=1;i--)
    {
        if(a[i]>b[i])return 1;
        if(a[i]<b[i])return -1;
    }
    return 0;
}
void numcpy(int q[],int p[],int i) {//把p粘到q的第i位 
    q[0]=p[0]+i-1;
    for(int j=1;j<=p[0];j++)
    {
       q[j+i-1]=p[j];
    }
    return ;
}
void jian(int a[],int b[]) {
    int flag=compare(a,b);
    if(flag==0) a[0]=0;
    else 
    {
        for(int i=1;i<=a[0];i++)
        {
            if(a[i]<b[i])
            {
                a[i+1]--;
                a[i]+=10;
            }
            a[i]=a[i]-b[i];
        }
        while(a[0]>0&&a[a[0]]==0)a[0]--;
    }
    return;
}
void jisuan() {
    c[0]=a[0]-b[0]+1;
    int smg[505];
    for(int i=c[0];i>=1;i--)
    {
        memset(smg,0,sizeof(smg));
        numcpy(smg,b,i); 
        while(compare(a,smg)>=0){c[i]++;jian(a,smg);}
    }
    while(c[0]!=0&&c[c[0]]==0)c[0]--;
}
void print(int c[]) {
    if(c[0]==0)cout<<"0"<<endl;
    else{
    
    for(int i=c[0];i>=1;i--)
    cout<<c[i];
    cout<<endl;}
}
int main()
{
    read(a);
    read(b);
    jisuan();
    print(a);
  return 0;
}
高精除以高精

 

posted @ 2017-09-04 17:19  啊宸  阅读(171)  评论(0编辑  收藏  举报