zoukankan      html  css  js  c++  java
  • hdu 1042 N!(高精度乘法 + 缩进)

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


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


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


    #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("
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    (兼容)IE9 以下版本浏览器兼容HTML5的方法
    使用ORACLE 中ROWNUM方法实现数据库分批获取
    更新上传到github的代码
    Spring-AOP
    C++结构体的应用_YCOJ
    基本类型数据封装
    sessionStorage 封装
    Vue国际化四 -- 本地缓存
    Vue国际化三【在下拉框中使用】
    Vue国际化二 【在表格中的使用】
  • 原文地址:https://www.cnblogs.com/james1207/p/3271334.html
Copyright © 2011-2022 走看看