hdoj-1042 N!

来源:互联网 发布:网红脸是什么体验知乎 编辑:程序博客网 时间:2024/05/19 12:37
题目详见http://acm.hdu.edu.cn/showproblem.php?pid=1042
搜索

 

对于大数(比如1000的阶乘)我们找不到一个数据类型存放这个数

1.用数组模拟大数的运算。
2.开一个比较大的整型数组,数组的元素代表数组的某一位。
3.通过对数组元素的运算模拟大数的运算。
4.将数组输出(最后去掉前导0,即如果结果是342,那么就不能输出为0342)
 
code1:数的低位存在数组中的低位,输出时倒过来从数组高位到低位输出
 
//#include<cstdio>  #include<iostream>//C++中标准输入输出流,没有iostream输出有错 #include<cstring>using namespace std;const int maxn=36000;//10!约有35660位 //数组稍微开大点 以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。int a[maxn];int main(){int n,i,j,c,s;while(scanf("%d",&n)!=EOF){memset(a,0,sizeof(a));//数组的初始化  memset(a/*数组名*/,0/*要赋予的值*/ ,sizeof(a)/*数组元素个数*/) a[0]=1;for(i=1;i<=n;i++){c=0;for(j=0;j<maxn;j++)//数的低位存在数组中的低位 {s=a[j]*i+c;//逐位相乘得到的值(可能>=10) a[j]=s%10;//考虑进位  第J位上的数 (数组中每个位置的值只能是一位数)c=s/10;// 向高位进位的值 }}for(j=maxn-1;j>=0;j--)//从高位向低位扫描 找到第一个不是零的数 (该for语句的循环体为空语句)if(a[j])  //for循环里的j一直自减直到a[j]!=0跳出for循环                break;          for(i=j;i>=0;i--)              printf("%d",a[i]);          printf("\n");  }return 0;}
个人比较喜欢code2
 
code2:数的低位存在数组中的高位,输出时直接从低位开始输出

 
//#include<cstdio>  #include<iostream>//C++中标准输入输出流,没有iostream输出有错 #include<cstring>using namespace std;const int maxn=36000;//10!约有35660位 //数组稍微开大点 以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。int a[maxn];int main(){int n,i,j,c,s;while(scanf("%d",&n)!=EOF){memset(a,0,sizeof(a));//数组的初始化 for(i=1,a[maxn-1]=1;i<=n;i++){c=0;for(j=maxn-1;j>=0;j--)//数的低位存在数组中的高位 {s=a[j]*i+c;a[j]=s%10;c=s/10;}}for(j=0;j<maxn;j++)if(a[j])break;for(i=j;i<maxn;i++) printf("%d",a[i]);          printf("\n");  }return 0;}


 
0 0