高精度

高精度加法:
 #include<bits/stdc++.h>
 using namespace std;
 const int N=1e6+10;
 string s1,s2;
 int a[N],b[N],c[N],t,len;
 int main()
 {
     cin>>s1>>s2;
     for(int i=0;i<s1.size();i++) a[s1.size()-i]=s1[i]-'0';
     for(int i=0;i<s2.size();i++) b[s2.size()-i]=s2[i]-'0';
     for(int i=1;i<=max(s1.size(),s2.size())+1;i++)
    {
         c[i]=a[i]+b[i]+t;//t是进位,要加上上一位进的位
        t=c[i]/10;
         c[i]%=10;
     }
    len=max(s1.size(),s2.size())+1;
    if(c[max(s1.size(),s2.size())+2]>0) len++;//判断是否最大的位进一位
     while(len>1&&c[len]==0) len--;//清除前导0
     for(int i=len;i>=1;i--) cout<<c[i];
     return 0;
 }

 

高精度乘法:

 #include<bits/stdc++.h>
 using namespace std;
 const int N=1e6+10;
 string s1,s2;
 int len,a[N],b[N],c[N*10],t;
 int main()
 {
     cin>>s1>>s2;
     for(int i=0;i<s1.size();i++) a[s1.size()-i]=s1[i]-'0';
     for(int i=0;i<s2.size();i++) b[s2.size()-i]=s2[i]-'0';
     for(int i=1;i<=s1.size();i++)
     {
         t=0;//进位
         for(int j=1;j<=s2.size();j++)
         {
             c[i+j-1]=a[i]*b[j]+t+c[i+j-1];//i+j-1是位数,第一位*第一位得到的数要在第一位才行
             t=c[i+j-1]/10;
             c[i+j-1]%=10;
        }
       c[i+s2.size()]=t;//最高位进位
     }
     len=s1.size()+s2.size();
     while(len>1&&c[len]==0) len--;
     for(int i=len;i>=1;i--) cout<<c[i];
     return 0;
 }

 

[NOIP1998 普及组] 阶乘之和

 #include<bits/stdc++.h>
 using namespace std;
 const int N=1e6+10;
 int a[N],b[N],len=100,n;
 int main()
 {
     cin>>n;
     a[0]=b[0]=1;
     for(int i=2;i<=n;i++)
     {
         for(int j=0;j<=100;j++) b[j]*=i;
         for(int j=0;j<=100;j++) if(b[j]>9) b[j+1]+=b[j]/10,b[j]%=10;
         for(int j=0;j<=100;j++)
         {
             a[j]+=b[j];
             if(a[j]>9) a[j+1]+=a[j]/10,a[j]%=10;
        }
     }
    while(a[len]==0&&len>0) len--;
     for(int i=len;i>=0;i--) cout<<a[i];
 }

 

posted @ 2023-06-04 10:40  o-Sakurajimamai-o  阅读(16)  评论(0)    收藏  举报
-- --