设为首页 加入收藏

TOP

hdu 1042 N!(高精度乘法 + 缩进)
2014-11-23 20:25:30 来源: 作者: 【 】 浏览:1
Tags:hdu 1042 高精度 乘法 缩进

题目大意:求n!, n 的上限是10000。


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

#include 
#include 
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;
}

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ2486:Apple Tree(树形DP) 下一篇UVA 10859 Placing Lampposts (动..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)
·超长干货:Python实 (2025-12-26 21:51:14)
·为什么 Java 社区至 (2025-12-26 21:19:10)
·Java多线程阻塞队列 (2025-12-26 21:19:07)