• 打印杨辉三角的几种方法


    下面代码仅供本人复习所用,实用性N低,各位飘过吧~~哈哈:>

    //
    // 杨辉三角. 
    //
    // 杨辉三角除每行第一个元素和最后一个原始均为 1 外,
    // 其他元素等于它上面左右两边的元素之和. 
    // 
    
    #include <cstdlib>
    #include <iostream>
    #include <iomanip>
    #include <stdexcept>
    #include <ctime>
    
    const size_t ROWS = 10;
    
    //
    // 二维数组法. 
    //
    void pascalTriangle_array(unsigned long (*array)[ROWS], const size_t rows)
    {
    	for (size_t i = 0; i < rows; ++i) {
    		array[i][0] = array[i][i] = 1;
    	}
    	for (size_t i = 2; i < rows; ++i) {
    		for (size_t j = 1; j < i; ++j) {
    			array[i][j] = array[i - 1][j - 1] + array[i - 1][j];
    		}
    	}
    }
    
    //
    // 一维列表法. 
    //
    void pascalTriangle_list(unsigned long *list, const size_t rows)
    {
    	unsigned long *pCurrRow, *pPrevRow;
    	
    	for (size_t i = 0; i < rows; ++i) {
    		pCurrRow = list + i * (i + 1) / 2;
    	 	*pCurrRow = *(pCurrRow + i) = 1;
    	}
    	for (size_t i = 2; i < rows; ++i) {
    		pPrevRow = list + (i - 1) * i / 2;
    		pCurrRow = list + i * (i + 1) / 2;
    		for (size_t j = 1; j < i; ++j) {
    			*(pCurrRow + j) = *(pPrevRow + j - 1) + *(pPrevRow + j);
    		}
    	}
    }
    
    
    double factorial(int n)
    {
    	double result = n;
    
    	while (0 < --n) {
    		result *= n;
    	}
    	return result > 0 ? result : 1;
    }
    
    //
    // 数学公式法. 
    //
    // 单项公式: n! / ((n-1)! * n!) 
    //
    unsigned long pascalTriangle_fomula(const unsigned int row, 
    									const unsigned int col)
    {
    	if (row < col) {
    		throw std::invalid_argument("pascalTriangle_fomula()");
    	}
    	return factorial(row) / (factorial(row - col) * factorial(col));
    }
    
    
    //
    // 测试. 
    //
    int main(void)
    {
    	//
    	// 数组方法. 
    	//
    	unsigned long triangle[ROWS][ROWS];
    
    	pascalTriangle_array(triangle, ROWS);
    	
    	for (size_t i = 0; i < ROWS; ++i) {
    		for (size_t j = 0; j <= i; ++j) {
    			std::cout << std::left << std::setw(4) << triangle[i][j];
    		}
    		std::cout << std::endl;
    	}
    	
    	//
    	// 列表方法. 
    	//	
    	unsigned long list[(1 + ROWS) * ROWS / 2];
    	unsigned long * pRow;
    	
    	pascalTriangle_list(list, ROWS);
    	
    	for (size_t i = 0; i < ROWS; ++i) {
    		pRow = list + i * (i + 1) / 2;
    		for (size_t j = 0; j <= i; ++j) {
    			std::cout << std::left << std::setw(4) << *(pRow + j);
    		}
    		std::cout << std::endl;
    	}
    	
    	//
    	// 公式方法. 
    	//
    	for (size_t i = 0; i < ROWS; ++i) {
    		for (size_t j = 0; j <= i; ++j) {
    			std::cout << std::left << std::setw(4) << pascalTriangle_fomula(i, j);
    		}
    		std::cout << std::endl;
    	}
    	
    	return EXIT_SUCCESS;
    }
    
  • 相关阅读:
    项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
    项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】
    javascript 容易忽略或者误用的七个基础知识点
    未来的路还很长
    Nodejs
    CSS浏览器兼容性相关
    HTML5
    一些正则
    Sublime 使用
    Array.prototype.slice.call(arguments,1)
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2066025.html
Copyright © 2020-2023  润新知