zoukankan      html  css  js  c++  java
  • HDOJ 1042 N! -- 大数运算

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1042

    Problem Description
    Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
     

    Input
    One N in one line, process to the end of file.
     

    Output
    For each N, output N! in one line.
     

    Sample Input
    1 2 3
     

    Sample Output
    1 2 6


    #include <stdio.h>
    #include <string.h>
    
    /* 一个数组元素表示 4 个十进制位,即数组是万进制的 */
    #define BIG_RADIX 10000
    #define RADIX_LEN 4
    /* 10000! 有 35660 位 */
    #define MAX_LEN (35660/RADIX_LEN + 1)
    
    int x[MAX_LEN + 1];
    
    void Big_Print(){
    	int i;
    	int start_output = 0;//用于跳过多余的0
    
    	for (i = MAX_LEN; i >= 0; --i){
    		if (start_output == 1){//如果多余的0已经跳过,则输出
    			printf("%04d", x[i]);
    		}
    		else if (x[i] > 0){//表示多余的0已经跳过
    			printf("%d", x[i]);
    			start_output = 1;
    		}
    	}
    	if (start_output == 0)//如果全为0
    		printf("0");
    }
    
    void Big_Multiple(int y){
    	int i;
    	int carry = 0;//保存进位
    	int tmp;
    
    	for (i = 0; i < MAX_LEN; ++i){
    		tmp = x[i] * y + carry;
    		x[i] = tmp % BIG_RADIX;
    		carry = tmp / BIG_RADIX;
    	}
    }
    
    void Big_Factorial(int N){
    	int i;
    
    	memset(x, 0, sizeof(x));
    	x[0] = 1;
    	for (i = 2; i <= N; ++i){
    		Big_Multiple(i);
    	}
    }
    
    int main(void){
    	int N;
    
    	while (scanf("%d", &N) != EOF){
    		Big_Factorial(N);
    		Big_Print();
    		printf("
    ");
    	}
    }


  • 相关阅读:
    Linux-文件目录管理
    20. 有效的括号
    242. 有效的字母异位词
    387. 字符串中的第一个唯一字符
    136. 只出现一次的数字
    14. 最长公共前缀
    268. 丢失的数字
    169. 多数元素
    26. 删除有序数组中的重复项
    283. 移动零
  • 原文地址:https://www.cnblogs.com/liushaobo/p/4373749.html
Copyright © 2011-2022 走看看