阶乘求解升级版

来源:互联网 发布:淘宝本地化生活服务 编辑:程序博客网 时间:2024/05/13 06:59

本题要求实现一个打印非负整数阶乘的函数。

函数接口定义:

void Print_Factorial ( const int N );

其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。

裁判测试程序样例:

#include <stdio.h>void Print_Factorial ( const int N );int main(){    int N;    scanf("%d", &N);    Print_Factorial(N);    return 0;}/* 你的代码将被嵌在这里 */

输入样例:

15

输出样例:

1307674368000
解题思路:由于N为1000以内的整数,若以常规方法会导致溢出。所以需要采取用数组来存取数值的每一位。即模拟乘法运算的过程
参考解答:#include <stdio.h>void Print_Factorial ( const int N );int main(){    int N;    scanf("%d", &N);    Print_Factorial(N);    return 0;}/* 你的代码将被嵌在这里 */void Print_Factorial(const int N){    if(N<0)    {        printf("Invalid input\n");    }    else    {        int num[3001]={0};//用来存放数据的每一位        int k=1;//将数据初始值为一位        int temp;//用来记录每次计算后数据的大小        int n=0; //作为进位        num[0]=1;//先将初始值赋值为1        for(int i=2;i<=N;i++)        {            for(int j=0;j<k;j++)            {                temp=num[j]*i+n;//相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)                num[j]=temp%10;//更新临时结果的位上信息                n=temp/10;//看是否有进位            }            while(n!=0)            {                num[k]=n%10; //新加一位,添加信息。位数增1                k++;                n/=10;//看还能不能进位            }        }        for(int i=k-1;i>=0;i--)        {            printf("%d",num[i]);        }        printf("\n");    }}
原创粉丝点击