高精度
高精度加法:
#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]; }

浙公网安备 33010602011771号