阶乘统计2

来源:互联网 发布:知茵女装网上专卖店 编辑:程序博客网 时间:2024/05/17 06:43

描述 Description

n的阶乘定义为n!=1*2*3*……*n 如3!=6
 n!通常最后会有很多0,如5!=120 最后有一个0,现在统计n!去除末尾的0后,最后k位是多少 

输入格式 InputFormat

 第一行包括两个数n,k 

输出格式 OutputFormat

如果n!不止k位,则输出最后k位,如果不足k位,则高位补零,补足k位后输出

注意!这里与阶乘统计1有区别!

样例输入 SampleInput 

7 2

样例输出 SampleOutput 

04

数据范围和注释 Hint

7!为5040,去除末尾的0为504,最后两位为04

100%满足1<=n<=1400000 1<=k<=10

来源 Source

Vivian Snow对P1018的改造
思路:
用一个int64的数做阶乘,就是简单粗暴的用for循环阶乘。但是在过程中随时去末尾0,同时如果乘积大于1000000000000,就取对1000000000000的余数,再继续阶乘,最后注意一下输出前导0。
#include <stdio.h>#include <string.h>int main(){    unsigned long long i, sum, n, k, len;char str[100];sum = 1;scanf("%lld%lld", &n, &k);for(i = 1; i <= n; i++)          //求阶乘{sum *= i;while(sum % 10 == 0)         //注意每次先乘再除零{sum /= 10;}sum %= 10000000000;}sprintf(str, "%lld", sum);        //打印及补零len = strlen(str)-1;while(len >= 0 && str[len] == '0'){len--;}for(i = len-k+1; i <= len; i++){if(i < 0){printf("0");}else{printf("%c", str[i]);}}printf("\n");return 0;}


0 0
原创粉丝点击