高精-----各种模板

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精-----各种模板相关的知识,希望对你有一定的参考价值。

高精加法

  代码

#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char a[501],b[501];
int x[501],y[501],z[50000];
int main()
{
    cin>>a;
    cin>>b;
    int l1=strlen(a),l2=strlen(b);
    for(int i=0;i<l1;i++)
       x[l1-i]=a[i]-48;
    for(int i=0;i<l2;i++)
       y[l2-i]=b[i]-48;
    int l3=1,s=0;
    while(l3<=l1||l3<=l2)
    {
        z[l3]=x[l3]+y[l3]+s;
        s=z[l3]/10;
        z[l3]%=10;
        l3++;
    }
    z[l3]=s;
    while(z[l3]==0)
       l3--;
    for(int i=l3;i>0;i--)
      cout<<z[i];
    return 0;
}

高精减

  代码

已规定     a>b!!!!!!
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[201],b[201]; int x[201],y[201],c[201]; int main() { cin>>a; cin>>b; int la=strlen(a),lb=strlen(b); for(int i=0;i<la;i++) x[la-i]=a[i]-0; for(int i=0;i<lb;i++) y[lb-i]=b[i]-0; int i=1,m; while(i<=la||i<=lb) { if(x[i]<y[i]) { x[i]+=10; x[i+1]--; } c[i]=x[i]-y[i]; i++; } m=i; while(c[m]==0) m--; for(int j=m;j>0;j--) cout<<c[j]; return 0; }
未规定   a>b!!!!

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char a[501],b[501],d[501];
int x[501],y[501],c[501];
int main()
{
cin>>a;
cin>>b;
if(strlen(a)<strlen(b)||strlen(a)==strlen(b)&&strcmp(a,b)<0)
{
strcpy(d,a);
strcpy(a,b);
strcpy(b,d);
cout<<"-";
}
int la=strlen(a),lb=strlen(b);
for(int i=0;i<la;i++)
x[la-i]=a[i]-‘0‘;
for(int i=0;i<lb;i++)
y[lb-i]=b[i]-‘0‘;
int i=1,m;
while(i<=la||i<=lb)
{
if(x[i]<y[i])
{
x[i]+=10;
x[i+1]--;
}
c[i]=x[i]-y[i];
i++;
}
m=i;
while(c[m]==0)
m--;
for(int j=m;j>0;j--)
cout<<c[j];
return 0;
}

高精例题

3054 高精度练习-文件操作

  时间限制: 1 s

 空间限制: 64000 KB
 题目等级 : 钻石 Diamond
 
 
题目描述 Description

输入一组数据,将每个数据加1后输出

 

输入描述 Input Description

输入数据:两行,第一行为一个数n,第二行为n个数据

输出描述 Output Description

输出数据:一行,为处理过的数据

样例输入 Sample Input

5

-1 2 100 -5 14

样例输出 Sample Output

0 3 101 -4 15

数据范围及提示 Data Size & Hint

数据范围:对60%为数据,ni≤32767

对100%为数据,ni≤10255

n<=500

数据改了7次终于改对了

分类标签 Tags 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
char a[90000];
int n,b[900000],c[900000],s=0,m=0;
bool z;
int main()
{
    scanf("%d",&n);
    for(int k=1;k<=n;k++)
    {
        m=0;
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
          cin>>a;
        int la=strlen(a);
        
        if(a[0]==-) z=1;
        else z=0;        
           if(z==0)
        {
            for(int i=0;i<la;i++)
             {
                b[la-i]=a[i]-0;
             }
            
            b[1]++;
            while(m<=la+1)
            {
                   if(b[m]==10)
                {
                       b[m+1]+=b[m]/10;
                       b[m]%=10;
                }
                c[m]=b[m];
                   m++;
            }
        }
        if(z==1)
        {
            for(int i=1;i<la;i++)
             {
                b[la-i]=a[i]-0;
             }
            if(la==2)
            {
                if(b[1]==1)
                 {
                   cout<<"0"<<" ";
                   continue;
                 } 
            }
            cout<<"-";
            b[1]--;
            while(m<=la)
            {
                   if(b[m]<0)
                   {
                       b[m]+=10;
                       b[m+1]--;    
                   }
                   c[m]=b[m];
                   m++;
            }
        }
        while(c[m]==0)
           m--;    
        for(int i=m;i>0;i--)
         cout<<b[i];
        cout<<" ";    
    }
    return 0;    
}

 高精乘

   代码

 

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char a[501],b[502];
int x[501],y[502],c[250001];
int main()
{
    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y));
    memset(c,0,sizeof(c));
    cin>>a;
    cin>>b;
    int la=strlen(a),lb=strlen(b);
    for(int i=0;i<la;i++)
       x[la-i]=a[i]-0;
    for(int i=0;i<lb;i++)
       y[lb-i]=b[i]-0;
    for(int i=1;i<=la;i++)
    {
        int m=0;
        for(int j=1;j<=lb;j++)
        {
            c[i+j-1]=x[i]*y[j]+c[i+j-1]+m;//在此可发现一个规律
                                   //当前乘积的位=两乘数当前要乘两数的位的和减一 
            m=c[i+j-1]/10;        
            c[i+j-1]%=10;
        }
        c[i+lb]=m;
    }
    int l=la+lb;     //可发现乘积的最终位数 =两乘数个位数的和 
    while(c[l]==0&&l>1)
       l--;
    for(int i=l;i>0;i--)
       cout<<c[i];
    return 0;                
}

 

高精除

  高精除低精   

    代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char a[501];
int b,x[501],c[501],y=0;
int main() 
{
    memset(c,0,sizeof(c));
    memset(x,0,sizeof(x));
    gets(a);
    int la=strlen(a);
    cin>>b;
    for(int i=0;i<la;i++)
      x[i+1]=a[i]-0;
    for(int i=1;i<=la;i++)
    {
        c[i]=(y*10+x[i])/b;
        y=(y*10+x[i])%b;
    }
    int l=1;
    while(l<la&&c[l]==0)
      l++;
    for(int i=l;i<=la;i++)
       cout<<c[i];
    return 0;    
}

  高精除高精   

    代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[501],b[501],c[501],ans,i;
void init(int a[])
{
    string s;
    cin>>s;
    a[0]=s.length();
    for(int i=1;i<=a[0];i++)
       a[i]=s[a[0]-i]-0;
}
void print(int a[])
{
    int i;
    if(a[0]==0)
    {
        cout<<0<<endl;
        return;
    }
    for(int i=a[0];i>0;i--)  cout<<a[i];
    cout<<endl;
    return;
}
int compare (int a[],int b[])
{
    int i;
    if(a[0]>b[0]) return 1;
    if(a[0]<b[0]) return -1;
    for(int i=a[0];i>0;i--)
    {
        if(a[i]>b[i])  return 1;
        if(a[i]<b[i]) return -1;
    }
    return 0;
}
void jian(int a[],int b[])
{
    int flag,i;
    flag=compare(a,b);
    if(flag==0)
    {
        a[0]=0;
        return ;
    }
    if(flag==1)
    {
        for(int i=1;i<=a[0];i++)
        {
            if(a[i]<b[i])
            {
                a[i+1]--;
                a[i]+=10;
            }
            a[i]-=b[i];
        }
        while(a[0]>0&&a[a[0]]==0) a[0]--;
        return ;
    }
}
void numcpy(int p[],int q[],int det)
{
    for(int i=1;i<=p[0];i++)
      q[i+det-1]=p[i];
    q[0]=p[0]+det-1;
}
void chugao(int a[],int b[],int c[])
{
    int i,tmp[501];
    c[0]=a[0]-b[0]+1;
    for(int i=c[0];i>0;i--)
    {
        memset(tmp,0,sizeof(tmp));
        numcpy(b,tmp,i);
        while(c[0]>0&&c[c[0]]==0) c[0]--;
        return ;
    }
}
int main()
{
    init(a);
    init(b);
    chugao(a,b,c);
    print(c);
    return 0;
}

 

 

 

 

高精开根

以上是关于高精-----各种模板的主要内容,如果未能解决你的问题,请参考以下文章

模板 高精度运算

[Template]高精度模板

高精度模板

VSCode自定义代码片段——.vue文件的模板

各种高精——一入高精深似海,从此AC是路人.

VSCode自定义代码片段1——vue主模板