zoj 2022 Factorial}

来源:互联网 发布:熊出没之淘宝熊兵 编辑:程序博客网 时间:2024/04/28 15:11
看了别人的代码,不需要考虑大数int就可以,哭死。。。//阶乘末尾零的个数等于while(n){ sum += n /5;n = n /5;}
//大数除法,加法,还不熟练!!!
#include<stdio.h>#include<string.h>int div5(char *a,char *b){int i,len,car,n,j;i = 0;car = 0;len = strlen(a);memset(b,0,sizeof(b));while(i<len){b[i] = (a[i] - '0' + car) / 5 + '0';car = (a[i] - '0' + car) % 5 * 10;i++;}i = 0;while(b[i] == '0') i++;len = strlen(&b[i]);if(len == 0) return 0;else {n = i;for(i = n,j = 0;i<n + len;i++,j++)b[j] = b[i];b[j] = '\0';return 1; }}void reverse(char *a){int i,j;char t;for(i = strlen(a) - 1,j = 0;i>j;i--,j++){t = a[i];a[i] = a[j];a[j] = t;}}void add(char*a,char*b){int i,j;int c;char ch;c = 0;for(i = 0;i<strlen(b);i++){ch = (a[i] + b[i] - 2*'0' + c) % 10 + '0';    c = (a[i] + b[i] - 2*'0' + c) / 10;    a[i] = ch;}while(c){if(i>=strlen(a)){a[i] = c % 10 + '0';c = c / 10;}else{ch = (a[i] - '0' + c) % 10 + '0';c = (a[i] - '0' + c) / 10;a[i] = ch;    }i++;}}int main(){int times,count,carriage,i;char ch[11];char result[11];char str[11];scanf("%d",×);while(times--){   memset(ch,0,sizeof(ch));        memset(result,0,sizeof(result));        memset(str,0,sizeof(str));        count = 0;scanf("%s",ch);div5(ch,result);strcpy(ch,result);reverse(result);while(div5(ch,str)){strcpy(ch,str);reverse(str);add(result,str);}reverse(result);printf("%s\n",result);}return 0;}

0 0
原创粉丝点击