• 4-10 阶乘计算升级版


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

    函数接口定义:

    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
    

    解题思路:

    C 语言提供的数据类型都不足以支持这么大的数据。该算法模拟了手算过程,用数组来存放最终结果的每位。由于 N 值不超过 1000,利用计算器计算了一下结果最多有 2568 位。所以本算法定义了一个 2568 位的数组来存放最终的结果。不想精确计算或者没有工具计算的话,可以直接定义一个很大的数组。

    算法过程:

    以计算 5 的阶乘为例,假设现在数组里已经存放了计算好的 4 的阶乘结果 2 4 (fact[1] = 2, fact[0] = 4),接下来要乘以 5。算法过程即为,4 * 5 加上进数 n(初始时 n 为 0),用 temp 保存这个值。temp 取余后放在 fact[0] 中。temp 再除以 10,得到进数 n,然后处理下一位。下一位操作与当前位的操作是一致的。就这样一致循环处理下去,直到没有进位。

    本质上是模拟手算的过程。

    最后逆序输出结果数组。

    解题代码:

    void Print_Factorial ( const int N) {
    	int fact[2568] = {0};
    	fact[0] = 1;
    	int n = 0, k = 1; // n 为进的数,k 为当前结果的总位数 
    	for (int i=2; i<=N; i++) {
    		for (int j=0; j<k; j++) {
    			int temp = i * fact[j] + n;
    			fact[j] = temp  % 10;
    			n = temp / 10; 
    			if (n && j==k-1) {
    				k++;  
    			} // 当有进位且已经处理到最前位时才开拓目标数组的下一位 
    		}
    	} 
    	for (int i=k-1; i>=0; i--) {
    		if (N >= 0) {
    			printf("%d", fact[i]);
    		} else {
    			printf("Invalid input");
    		}
    	}
    	printf("
    ");
    }
  • 相关阅读:
    Java for LeetCode 025 Reverse Nodes in k-Group
    Java for LeetCode 024 Swap Nodes in Pairs
    Java for LeetCode 023 Merge k Sorted Lists
    【JAVA、C++】LeetCode 022 Generate Parentheses
    【JAVA、C++】LeetCode 021 Merge Two Sorted Lists
    【JAVA、C++】LeetCode 020 Valid Parentheses
    【JAVA、C++】LeetCode 019 Remove Nth Node From End of List
    9-[记录操作]--数据的增删改,权限管理
    8-[表操作]--foreign key、表与表的关系
    7-[表操作]--完整性约束
  • 原文地址:https://www.cnblogs.com/andywenzhi/p/5722114.html
Copyright © 2020-2023  润新知