自己写的复杂点的大数阶乘(会超时,有助于理解大数相乘)
2015-07-24 17:53
309 查看
#include<stdio.h> #include<string.h> #define MAX(x,y) x>y?x:y char z[100010]; int j; void bigmultiply(int n){int x[100010],y[100010]; memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); int t=j,i,temp=0,max=0; for(i=t-1,j=0;i>=0;--i,j++)x[j]=z[i]-'0'; for(i=0;i<t;++i){j=i; temp=x[i]*n; while(temp){ y[j]+=temp%10; if(y[j]>9)y[j+1]+=y[j]/10,y[j]%=10; j++; temp/=10; } while(y[j])j++; max=MAX(max,j); } for(i=max-1,j=0;i>=0;--i,j++)z[j]=y[i]+'0'; z[j]='\0'; } int main(){ int m,t; while(~scanf("%d",&m)){memset(z,0,sizeof(z));z[0]='1';j=1; //bigmultiply(m); for(int i=1;i<=m;++i)bigmultiply(i); printf("%s\n",z); } return 0; }
借助模板写的:
#include<stdio.h> #include<string.h> #define MAXN 100010 #define MAX(x,y) x>y?x:y int m[MAXN]; void fac(int n){int i,j,temp1,temp2,t=0; m[0]=1; for(i=2;i<=n;++i){temp2=0; for(j=0;j<=t||temp1;++j){ temp1=m[j]*i+temp2; m[j]=temp1%10; temp2=temp1/10; t=MAX(t,j); } } for(j=MAXN-1;j>=0;j--)if(m[j])break; for(i=j;i>=0;i--)printf("%d",m[i]); puts(""); } int main(){ int N; while(~scanf("%d",&N)){memset(m,0,sizeof(m)); fac(N); } return 0; }
相关文章推荐
- Hibernate学习笔记
- Android Screen Monitor 下载地址
- Java 内存泄露 与 Reference
- NGUI ScrollView动态添加和删除对象。
- 现在学习的
- ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn
- 视图控制器和屏幕旋转
- 给你两个经纬度,计算他们之间的距离
- 【转】java 文件 读取目录下的所有文件(包括子目录)
- java程序一年里一个月有多少天
- QuartZ Cron表达式
- 改变DatePicker和TimePicker大小,使之横向并列展示
- SqlServer 与 MySQL 基本操作语句对比
- 给网站添加一个config.js,js无法声明常量,封装js变量取值器
- js数组去重的4个方法
- .net打印
- Product of Array Except Self
- 几道水题(18岁的生日,空心三角形)
- 暑假集训——贪心专题——D题
- Android权限