你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / C专栏
hdu 1042 N!(高精度乘法 + 缩进)
 
题目大意:求n!, n 的上限是10000。

 


解题思路:高精度乘法 , 因为数据量比较大, 所以得用到缩进,但因为是乘法,缩进只能在10^5, 不然在乘的过程中就超过int型。然后数值位数大概在8000位以下。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <string.h>
using namespace std;
  
const int MAXN = 100000;
const int N = 8000;
  
struct bign {
    int len;
    int s[N];
      
    bign() {
        this -> len = 1;
        memset(s, 0, sizeof(s));
    }
    bign (int number) {*this = number;}
    bign (const char* number) {*this = number;}
      
    bign change(bign cur) {
        bign now;
        now = cur;
        for (int i = 0; i < cur.len; i++)
            now.s[i] = cur.s[cur.len - i - 1];
        return now;
    }
      
    void delZore() {    // 删除前导0.
        bign now = change(*this);
        while (now.s[now.len - 1] == 0 && now.len > 1) {
            now.len--;
        }
        *this = change(now);
    }
      
    void put() {    // 输出数值。
        delZore();
        printf("%d", s[0]);
        for (int i = 1; i < len; i++)
            printf("%05d", s[i]);
    }
      
    bign operator = (const char *number) {
        memset(s, 0, sizeof(s));
        int dist = strlen(number);
        int k = dist % 8;
        for (int i = 0; i < k; i++)
            s[0] = s[0] * 10 + number[i] - '0';
    int cnt = 0;
    for (int i = k; i < dist; i++, cnt++)
        s[cnt / 8 + 1] = s[cnt / 8 + 1] * 10 + number[i] - '0';
    len = cnt / 8 + 1;
    return *this;
    }
  
    bign operator = (int number) {
    char string[N];
    sprintf(string, "%d", number);
    *this = string;
    return *this;
    }
  
    bign operator * (const bign &cur){  
    bign sum, a, b;
    sum.len = 0; 
    a = a.change(*this);
    b = b.change(cur);
  
    for (int i = 0; i < a.len; i++){  
        int g = 0;  
  
        for (int j = 0; j < b.len; j++){  
        int x = a.s[i] * b.s[j] + g + sum.s[i + j];  
        sum.s[i + j] = x % MAXN;  
        g = x / MAXN;  
        }  
        sum.len = i + b.len;  
  
        while (g){  
        sum.s[sum.len++] = g % MAXN;  
        g = g / MAXN;  
        }  
    }  
    return sum.change(sum);  
    }  
};
  
int main() {
    int n;
    while (scanf("%d", &n) == 1) {
    bign sum = 1;
    for (int i = 2; i <= n; i++) {
        bign now = i;
        sum = sum * now;
    }       
    sum.put();
    printf("\n");
    }
    return 0;
}

 

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089