zoukankan      html  css  js  c++  java
  • HDU 1023 Train Problem II 大数打表Catalan数

    一个出栈有多少种顺序的问题。一般都知道是Catalan数了。

    问题是这个Catalan数非常大,故此须要使用高精度计算。

    并且打表会速度快非常多。打表公式要熟记:

    Catalan数公式 Cn=C(2n,n) / (n+1);
    递推公式 C(n ) = C(n-1)*(4*n-2) / (n+1)

    高精度乘以一个整数和高精度除以一个整数的知识。这样还是使用整数数组比較好计算,假设使用string那么就不太好计算了,由于整数也可能是多位的。


    const int MAX_N = 101;
    short catalan[MAX_N][MAX_N];//catlans[i][0] save the length
    
    void calCatalans()
    {
    	short carry = 0, len = 1;
    	catalan[1][0] = 1; catalan[1][1] = 1;
    	catalan[2][0] = 1; catalan[2][1] = 2;
    	for (int i = 3; i < MAX_N; i++)
    	{
    		carry = 0;
    		for (int j = 1; j <= len; j++)//高精度乘以一个整数
    		{
    			short sum = catalan[i-1][j]*((i<<2)-2) + carry;
    			carry = sum / 10;
    			catalan[i][j] = sum % 10;
    		}
    		while (carry)
    		{
    			catalan[i][++len] = carry % 10;
    			carry /= 10;
    		}
    		for (int j = len; j > 0; j--)//高精度除以一个整数
    		{
    			short sum = catalan[i][j] + carry*10;
    			catalan[i][j] = sum / (i+1);
    			carry = sum % (i+1);//一定能除尽。故此无需考虑余数情况
    		}
    		while (catalan[i][len] == 0) len--;
    		catalan[i][0] = len;
    	}
    }
    
    int main()
    {
    	calCatalans();
    	int n;
    	while (~scanf("%d", &n))
    	{
    		for (int i = catalan[n][0]; i > 0; i--)
    		{
    			printf("%d", catalan[n][i]);
    		}
    		putchar('
    ');
    	}
    	return 0;
    }



  • 相关阅读:
    关于2019-nCoV事件中新媒体的作用
    评估移民宇宙计划
    关于2019-nCoV事件,分析自己的焦虑心理
    肺炎阴云仍未散去,今天捡到一个贝壳
    关于新型肺炎,重点是毒性
    提高效率的方法
    《白说》读书笔记
    MIPS下载运行busybox
    camera模组笔记
    求知领域
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7324442.html
Copyright © 2011-2022 走看看