@xunuo
2017-01-18T13:35:42.000000Z
字数 1721
阅读 1265
Time limit2000ms Memory limit 32768kB
高精度
来源:
HDU 2940 Hex Factorial
vjudge A Hex Factorial
The expression N!, reads as the factorial of N, denoting the product of the first N positive integers. If the factorial of N is written in hexadecimal without leading zeros, can you tell us how many zeros are there in it? Take 15! as an example, you should answer "3" because (15)10! = (13077775800)16, and there are 3 zeros in it.
The input contains several cases. Each case has one line containing a non-negative decimal integer N (N ≤ 100). You need to count the zeros in N! in hexadecimal. A negative number terminates the input.
For each non-negative integer N, output one line containing exactly one integer, indicating the number of zeros in N!.
1
15
-1
0
3
题意:
该题目的为求某数的阶乘后再将其转换为16进制数,问其16进制数中有多少个0。
多组输入,输入一个数,输出0的个数,当输入负数时结束!
大数的进制转换:一直除以该数,当商为0时结束,转换结果为每次所得的余数。
完整代码:
#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;int a[160],b[160],s[160];///10!的位数未超过160。int main(){int n;while(scanf("%d",&n)!=EOF){if(n<0)///注意!!!当n<0的时候都要结束!!!break;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(s,0,sizeof(s));a[0]=1;int num=1;int t;///计算n的阶乘!!!for(int i=1;i<=n;i++){int temp=0;///进位!for(int j=0;j<num;j++){t=i*a[j]+temp;a[j]=t%10;temp=t/10;}while(temp){a[num]=temp%10;num++;temp/=10;}}///去前导零for(int i=num;i>0;i--){if(a[i]==0)num--;elsebreak;}/*printf("10jz:\n");for(int i=num;i>=0;i--)printf("%d",a[i]);printf("\n");*////将高精度10进制数转为16进制!!int j=0;while(a[num]>0){t=0;for(int i=num;i>=0;i--){t=t*10+a[i];a[i]=t/16;t%=16;if(i==0)s[j]=t;}for(int i=num;i>=0;i--){if(a[i]==0)num--;elsebreak;}j++;}//printf("%d#\n",j);/*printf("16jz:\n");for(int i=j-1;i>=0;i--)printf("%d",s[i]);printf("\n");*////计算0的个数int count=0;for(int i=j-1;i>=0;i--){if(s[i]==0)count++;}printf("%d\n",count);}return 0;}
