杨辉三角,是中国古代数学的杰出研究成果之一,出现在中国南宋数学家杨辉1261年所著的《详解九章算法》中,是二项式系数在三角形中的一种几何排列,把组合内在的数字规律直观地从图形中体现出来。其主要规律(如图示意)为:第n行有n个数,每行头数和尾数均为1,其余的数为上一行左右两边数之和,每行的数左右对称。通过C 实现杨辉三角的方法很多,结合近期对vector的学习 ,通过vector定义n×n的数组来实现。

怎么让杨辉三角代码居中(自学C第)(1)

该动图来源百度图片(侵删)

怎么让杨辉三角代码居中(自学C第)(2)

编写的程序&注解

怎么让杨辉三角代码居中(自学C第)(3)

测试结果

知识点:

❶ vector<vector<int> >nums(n, vector<int>(n, 0)); 定义了一个vector容器,元素类型为vector,初始化为包含n个vector对象,每个对象又是一个新定义的vector对象的拷贝,而新定义的vector对象被初始化为n个0,由此定义一个n*n的二维数组。vector<int>& nums 其中vector为容器名称,int为容器数据类型,nums为容器变量,nums表示未指定长度;nums(n)表示指定了长度。&表示传入函数的是vector的物理地址,函数内部对vector改变时,原始的数据也会改变;vector<int> nums表示传入函数的是vector的复制(复制品存入新的物理地址中),函数内部对vector改变时,原始的数据不会改变。

❷ vector ['vektər](向量/矢量)是封装了一个能存放任意类型动态数组的顺序容器(Sequence Container)。顺序容器中的元素按照线性顺序排序,可以通过元素在顺序容器中的位置访问对应的元素。vector 是C STL的一个重要的数据结构(动态的数组)。其头文件为:#include<vector>。vector不需要动态操作内存,不用担心内存泄露等问题。常见的几种定义和使用方法:

vector<int>nums; //不指定长度 vector<int>nums(n); // 指定长度为n,每个元素的初值默认为0 vector<int>nums(n,1); // 指定长度为n,每个元素的初值为1 vector<int>nums{1,2,3,4,5}; //每个元素均赋初值 vector<vector<int> >nums {{1,2,3},{1,2,3}}; //二维数组每个元素均赋初值(注意空格) nums.size(); //获得长数组度 nums.push_back(x); //从数组末端插入一个元素x(x为要插入的值) nums.pop_back(x); //从数组末端删掉一个元素 nums.clear(); //清空所有元素 nums.empty(); //判断nums是否为空,空返回true nums.insert(nums.begin() i, x); //在第i 1个元素前面插入x nums.erase(nums.begin() 2); //删除第3个元素 nums.erase(nums.begin() i, nums.end() j); //删除区间[i,j)

❸ <iomanip> 是i/o流控制头文件,i/o代表输入/输出,manip是manipulator(操纵器)的缩写。对cin,cout等函数的一些操纵控制运算,一些常见的控制函数的:

//setw(n) 在输出操作中设置字段宽度,宽度为n个字符,默认是右对齐 cout<<setw(6)<<1234<<endl; //输出的结果:(空格)(空格)1234 //域宽n为6,1234占了4位,剩下2位用空格表示,如果n=7,剩下的3为用空格表示; cout<<setw(6)<<1234<<5678<<endl; //输出的结果:(空格)(空格)123445678 //说明setw(n)设定域宽只对其后的第一个<<(流插入运算符)中的内容有效 //Sets the number of characters to be used as thefield width for the next insertion operation. cout<<left<<setw(6)<<1234<<endl; //如果需要左对齐,在setw前加left cout<<'A'<<setw(3)<<'B'<<endl; // A后面输出3个字符,B占一个字符,剩余2个字符用空格填充

//setfill(char c) 在设定的域宽中,由字符c填充没有占用的宽度 cout<<setfill('@')<<setw(6)<<1234<<endl; //输出的结果:@@1234 cout<<setfill('*')<<setw(6)<<1234<<endl; //输出的结果:**1234 cout<<'A'<<setfill('*')<<setw(3)<<'B'<<endl; //输出的结果:A**B

//setbase(int n) : 将数字转换为 n 进制,计算机一般的进制为8进制、10进制、16进制 cout<<setbase(8)<<1234<<endl; //输出的结果:2322 cout<<setbase(16)<<1234<<endl; //输出的结果:4d2

//setprecision(n)可控制输出流显示浮点数的数字个数,C 默认的流输出数值有效位是6 double a = 7 / 3; cout << setprecision(1) << a << endl; //输出的结果:2 cout << setprecision(4) << a << endl; //输出的结果:2.333 (按四舍五入进行保留)

自学 C 第 1 课 数字大小排序

自学 C 第 2 课 数组包含关系

自学 C 第 3 课 正整数反序输出

自学 C 第 4 课 计算体积及表面积

,