hdu_1042(模拟大数乘法)
计算n!
1 #include<cstring> 2 #include<cstdio> 3 using namespace std; 4 int num[50000]; 5 int main() 6 { 7 int n; 8 while(~scanf("%d",&n)) 9 { 10 memset(num,0,sizeof(num)); 11 int len = 1; 12 num[1] = 1; 13 for(int i = 2; i <= n; i++){ 14 for(int j = 1; j <= len; j++){ 15 num[j] = num[j]*i; 16 } 17 for(int j = 1; j <= len; j++){ 18 if(num[j]>9) { 19 num[j+1] += num[j]/10; 20 num[j] = num[j]%10; 21 } 22 if(num[len+1]!=0) len++; 23 } 24 } 25 for(int i = len; i >= 1; i--) printf("%c",num[i]+'0'); 26 puts(""); 27 } 28 return 0; 29 }
用大数的模板也可以,不过每次要吧数字转化成字符串,其实还是自己写比较简单,处理一个简单的进位就可以了
下面是板子:
1 void mult(char* A,char* B,char* ans) 2 { 3 int a[size+1]= {0}; 4 int b[size+1]= {0}; 5 int pa=0,pb=0; 6 int c[2*size+1]= {0}; 7 8 int lena=strlen(A); 9 int lenb=strlen(B); 10 11 for(int i=lena-1; i>=0; i--) 12 a[pa++]=A[i]-'0'; 13 for(int j=lenb-1; j>=0; j--) 14 b[pb++]=B[j]-'0'; 15 16 for(pb=0; pb<lenb; pb++) 17 { 18 int w=0; //低位到高位的进位 19 for(pa=0; pa<=lena; pa++) 20 { 21 int temp=a[pa]*b[pb]+w; 22 w=temp/10; 23 temp=(c[pa+pb]+=temp%10); 24 c[pa+pb]=temp%10; 25 w+=temp/10; 26 } 27 } 28 bool flag=false; 29 bool sign=false; //标记ans是否为全0 30 for(pa=0,pb=lena+lenb-1; pb>=0; pb--) 31 { 32 if(!flag && c[pb]==0) //删除ans开头的0 33 continue; 34 else 35 flag=true; 36 37 sign=true; 38 ans[pa++]=c[pb]+'0'; 39 } 40 if(sign) 41 ans[pa]='\0'; 42 else 43 { 44 ans[0]='0'; 45 ans[1]='\0'; 46 } 47 48 return; 49 }
1 string sum(string s1,string s2) //大数加法 2 { 3 if(s1.length()<s2.length()) 4 { 5 string temp=s1; 6 s1=s2; 7 s2=temp; 8 } 9 int i,j; 10 for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--) 11 { 12 s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节 13 if(s1[i]-'0'>=10) 14 { 15 s1[i]=char((s1[i]-'0')%10+'0'); 16 if(i) s1[i-1]++; 17 else s1='1'+s1; 18 } 19 } 20 return s1; 21 } 22 23 string Mult(string s,int x) //大数乘以整形数 24 { 25 reverse(s.begin(),s.end()); 26 int cmp=0; 27 for(int i=0;i<s.size();i++) 28 { 29 cmp=(s[i]-'0')*x+cmp; 30 s[i]=(cmp%10+'0'); 31 cmp/=10; 32 } 33 while(cmp) 34 { 35 s+=(cmp%10+'0'); 36 cmp/=10; 37 } 38 reverse(s.begin(),s.end()); 39 return s; 40 } 41 string Multfa(string x,string y) //大数乘法 42 { 43 string ans; 44 for(int i=y.size()-1,j=0;i>=0;i--,j++) 45 { 46 string tmp=Mult(x,y[i]-'0'); 47 for(int k=0;k<j;k++) 48 tmp+='0'; 49 ans=sum(ans,tmp); 50 } 51 return ans; 52 }
模板转自:http://blog.csdn.net/u012860063/article/details/36903491