粘贴一下我修改的内容:
这里的+1的方法值得借鉴
//没有修改的
#include<iostream> int a[100000][1001],m[1001],n[1001],nm[1001],ln=0,lm=0,lnm=0,w,nmm[1001],ans[1001],f=1,k,t; using namespace std; int main() { int nn,mm,i,g=0,j; cin>>mm>>nn; for(i=1;i<=mm;i++) { for(j=1;j<=1000;j++) { a[i][j]=a[i-1][j]*i+g; g=a[i][j]/10; a[i][j]=a[i][j]%10; } } for(i=1;i<=1000;i++) { m[i]=a[mm][i]; if(m[i]>0) lm++; n[i]=a[nn][i]; if(n[i]>0) ln++; nm[i]=a[n-m][i]; if(nm[i]>0) lnm++; } for(i=1;i<=lnm+1;i++) { for(j=1;j<=lm+1;j++) { w=i+j-1; nmm[w]=nm[i]*m[j]+g; g=nmm[w]/10; nmm[w]=nmm[w]%10; } } while(f==1) { for(i=1;i<=ln;i++) { n[i]=n[i]-nmm[i]; if(n[i]<0) { n[i+1]=n[i+1]-1; n[i]=n[i]+10; } } k=1; while(ans[k]==9) k++; ans[k]++; k=1; while(ans[k]==9) { ans[k]=0; k++; } ans[k]++; f=0; for(i=1;i<=ln;i++) if(n[i]>0) f=1; } k=1000; while(ans[k]==0) k--; if(k>5) t=k+1-5; else t=1; for(i=k;i>=t;i--) cout<<ans[i]; cout<<" "<<k; return 0; }
修改之后:
#include<iostream> int a[100000][1001],m[1001],n[1001],nm[1001],ln=0,lm=0,lnm=0,w,nmm[1001],ans[1001],f=1,k,t; using namespace std; int main() { int nn,mm,i,g=0,j; cin>>mm>>nn; a[0][1]=1;// //a[i][]这个数组保存 i 的阶乘 for(i=1;i<=mm;i++) { g=0;// for(j=1;j<=1000;j++) { a[i][j]=a[i-1][j]*i+g; g=a[i][j]/10; a[i][j]=a[i][j]%10; } } /* for(int i=1;i<=100;i++) { for(int j=1;j<=100;j++) cout << a[i][j]; cout << endl; } */ for(i=1;i<=1000;i++) { m[i]=a[mm][i]; //if(m[i]>0) lm++; if(m[i]>0) lm=i;// n[i]=a[nn][i]; //if(n[i]>0) ln++; if(n[i]>0) ln=i;// //nm[i]=a[n-m][i]; nm[i]=a[mm-nn][i]; //if(nm[i]>0) lnm++; if(nm[i]>0) lnm=i;// } //cout << lm<<" " <<ln <<" "<< lnm<< " "<<endl; /* for(int i=1;i<=100;i++) { for(int j=1;j<=100;j++) { cout << a[i][j]; } cout << endl; } */ g = 0;//初始化 //m! * (m-n)! /* for(i=1;i<=lnm+1;i++) { for(j=1;j<=lm+1;j++) { w=i+j-1; nmm[w]=nm[i]*m[j]+g; g=nmm[w]/10; nmm[w]=nmm[w]%10; } } */ //nmm[]=nn!*(nn-mm)! for(i=1;i<=lnm+1;i++) { for(j=1;j<=ln+1;j++) { w=i+j-1; //nmm[w]=nm[i]*m[j]+g; nmm[w]=nmm[w]+nm[i]*n[j]+g; g=nmm[w]/10; nmm[w]=nmm[w]%10; } } //for(i=1;i<=100;i++) cout << nmm[i]; //cout << endl; /* while(f==1) { for(i=1;i<=ln;i++) { n[i]=n[i]-nmm[i]; if(n[i]<0) { n[i+1]=n[i+1]-1; n[i]=n[i]+10; } } k=1; while(ans[k]==9) k++; ans[k]++; f=0; for(i=1;i<=ln;i++) if(n[i]>0) f=1; } */ //mm!/nmm[] while(f==1) { //mm-nmm for(i=1;i<=lm;i++) { m[i]=m[i]-nmm[i]; if(m[i]<0) { m[i+1]=m[i+1]-1; m[i]=m[i]+10; } } //ans[]数组 k=1; //while(ans[k]==9) k++; while(ans[k]==9) { ans[k]=0; k++; } ans[k]++; f=0; for(i=1;i<=lm;i++) if(m[i]>0) f=1; } k=1000; while(ans[k]==0) k--; if(k>5) t=k+1-5; else t=1; for(i=k;i>=t;i--) cout<<ans[i]; cout<<" "<<k; return 0; }