杨辉三角计算技巧(自学C第)
杨辉三角计算技巧(自学C第)//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<<s
杨辉三角,是中国古代数学的杰出研究成果之一,出现在中国南宋数学家杨辉1261年所著的《详解九章算法》中,是二项式系数在三角形中的一种几何排列,把组合内在的数字规律直观地从图形中体现出来。其主要规律(如图示意)为:第n行有n个数,每行头数和尾数均为1,其余的数为上一行左右两边数之和,每行的数左右对称。通过C 实现杨辉三角的方法很多,结合近期对vector的学习 ,通过vector定义n×n的数组来实现。
该动图来源百度图片(侵删)
编写的程序&注解
测试结果
知识点:
❶ 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 课 计算体积及表面积