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

时间: 2024-08-07 08:22:54

hdu_1042(模拟大数乘法)的相关文章

大数乘法的几种算法分析及比较(2014腾讯南京笔试题)

转自:http://blog.csdn.net/chhuach2005/article/details/21168179 1.题目 编写两个任意位数的大数相乘的程序,给出计算结果. 2.题目分析 该题相继被ACM.华为.腾讯等选作笔试.面试题,若无准备要写出这种程序,还是要花一定的时间的.故,觉得有必要深入研究一下.搜索了网上的大多数该类程序和算法,发现,大数乘法主要有模拟手工计算的普通大数乘法,分治算法和FFT算法.其中普通大数乘法占据了90%以上,其优点是空间复杂度低,实现简单,时间复杂度为

HDOJ-1042 N!(大数乘法)

http://acm.hdu.edu.cn/showproblem.php?pid=1042 题意清晰..简单明了开门见山的大数乘法.. 10000的阶乘有35000多位 数组有36000够了 # include <stdio.h> # include <string.h> # define MAX 36000 int BigNum[MAX], NowLen; void Multi(int number) { int Temp[MAX]={0}, Tlen = 0, t;//Tem

组合数学 + 大数乘法 + 大数除法 之 hdu 1261 字串数

//  [3/17/2015 JmingS] /* 此题可直接推导出公式: {(A1+A2+……+An)!} / {A1!A2!……An!} 由于 (12×26)! = 312! 只能通过数组来存储,所以又涉及『大数乘法』和『大数除法』, 大数实现的主要思想模拟手算,具体参考程序. */ 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5

[POJ] #1002# Exponentiation : 大数乘法

一. 题目 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 156373   Accepted: 38086 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of

用分治法实现大数乘法,加法,减法(java实现)

大数乘法即多项式乘法问题,求A(x)与B(x)的乘积C(x),朴素解法的复杂度O(n^2),基本思想是把多项式A(x)与B(x)写成 A(x)=a*x^m+b B(x)=c*x^m+d 其中a,b,c,d为x的多项式. 则A(x)*B(x)=(ac)*x^2m+(ad+bc)*x^m+bd 由ad+bc=(a+b)(c+d)-ac-bd 原来的4次乘法和1次加法由3次乘法和2次减法代替,减少了一次乘法操作. 用同样的方法应用到abcd的乘法上. (以上内容摘自互联网) 以下为用java实现的代码

最短的计算大数乘法的c程序

#include <stdio.h> char s[99],t[99]; int m,n; void r(int i,int c) { int j=0,k=i; while(k)c+=s[j++]*t[k---1]; if(i)r(i-1,c/10); printf("%d",c%10); } void main() { gets(s);gets(t); while(s[n])s[n++]-=48; while(t[m])t[m++]-=48; r(m+n-1,0); }

大数乘法

1027 大数乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 <= 1000,A,B >= 0) Output 输出A * B Input示例 123456 234567 Output示例 28958703552 相关问题 大数加法 0 大数开平方 640 大数进制转换 320 大数除法 320 大数乘法 V2 80 代码: 1 #inclu

ACM学习历程—51NOD1028 大数乘法V2(FFT)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 题目大意就是求两个大数的乘法. 但是用普通的大数乘法,这个长度的大数肯定不行. 大数可以表示点值表示法,然后卷积乘法就能用FFT加速运算了. 这道题是来存模板的. 代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath>

【大数乘法】

1 #include<cstdio> 2 #include<cstring> 3 const int Len = 100; 4 void Mul(char a[],char b[],char c[])//大数乘法 5 { 6 int i,j; 7 int alen = strlen(a),blen = strlen(b); 8 memset(c,0,Len); 9 for(i = 0; i < alen; i++) 10 for(j = 0; j < blen; j++