杨辉三角形c/c++
多种写法多种思路,重在参考,莫要争辩!
s
#include<iostream>
#include<iomanip>
using namespace std;
void triangle(){
//定义一个二维动态数组
int n;//定义层数
cout<<"你想得到几层的杨辉三角形:";
cin>>n;
while(n<=0){
cout<<"输入错误,请重新输入!"<<endl;
cout<<"你想得到几层的杨辉三角形:";
cin>>n;
}
int **a;//定义二维指针
a = (int**)calloc(n,sizeof(int*));//申请一组一维指针空间
int i;//循环通用变量
for(i = 0; i<n; ++i){
a[i] = (int*)calloc(n,sizeof(int));//对每个一维指针再申请一行空间
}
//定义数组初值
if(n>=2){
a[0][0] = 1;
a[1][0] = 1;
a[1][1] = 1;
}else{
a[0][0] = 1;
}
//以上一层的数为基础,推导出下一层的数
for(int x = 3; x<=n; ++x){//前两层已经定义,故从第三层开始
//定义每层开始和末尾两个数字1
a[x-1][0] = 1;//x-1为数组下标从0开始,第三行实则为2,故-1
a[x-1][x-1] = 1;
//定义除始末的中间值
// 1
// 1 1
// 1 2 1
//1 3 3 1
//定义y,实际含义为记录下标
for(int y = 1 ; y<=x-2; ++y){//x-2为中间值数量,除去始末故-2
a[x-1][y] = a[x-2][y-1] + a[x-2][y];//中间值下标从1开始,为上一层同下标的值和-1下标值的和,x-1为此层,x-2为上一层
}
}
//左侧输出遍历
//for(i = 0; i<n ; ++i){
// for(int j = 0; j<=i ; ++j){//j<=i,本层虽有许多空间,但实际输出数量等于层数,输出大于无意义
// cout<<a[i][j]<<" ";
// }
// cout<<endl;
//}
//正三角输出遍历
int num = 0;//记录最大数
for(i = 0; i<n ; ++i){
for(int j = 0; j<=i ; ++j){//j<=i,本层虽有许多空间,但实际输出数量等于层数,输出大于无意义
(num < a[i][j]) ? (num = a[i][j]) : num = num;
}
}
//cout<<"最大数是"<<num<<endl;
int size = 0;//记录最大数的位数
while(num){
num = num / 10;
++size;
}
for(i = 0; i<n ; ++i){
int kong = n-(i+1);//层数-当前层数(i+1)
while(kong){
cout<< setiosflags(ios::left) << setw(size);
cout<<"";
--kong;
}
for(int j = 0; j<=i ; ++j){//j<=i,本层虽有许多空间,但实际输出数量等于层数,输出大于无意义
cout<< setiosflags(ios::left) << setw(size);
cout<<a[i][j];
cout<< setiosflags(ios::left) << setw(size);
cout<<"";
}
cout<<endl;
}
}
void text(){
int a[5][5] = {{1,1,1,1,1},{11,11,11,11,11},{5,5,5,5,5},{6,6,6,6,6},{11111,11,1,1,1}};
int n = 5;
int i;
for(i = 0; i<n ; ++i){
for(int j = 0; j<=i ; ++j){//j<=i,本层虽有许多空间,但实际输出数量等于层数,输出大于无意义
cout<< setiosflags(ios::left) << setw(5);
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
int main(){
triangle();
return 0;
}
h
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int n;//层数
cout<<"需要输入多少层:";
cin>>n;
int x=n+1;
int arr[100][100];
for(int i=0;i<n;i++){
arr[i][0]=arr[i][i]=1;//每行第一个数和最后一个等于0
}
for(int m=2;m<n;m++){//从第三行开始
for(int j=1;j<m;j++){
arr[m][j]=arr[m-1][j-1]+arr[m-1][j];//上一行的元素+上一行元素前一个
}
}
int num = 0;//记录最大数
for(i = 0; i<n ; ++i){
for(int j = 0; j<=i ; ++j){
(num <arr[i][j]) ? (num = arr[i][j]) : num = num;
}
}
int size = 0;//记录最大数的位数,用于输出位数的控制
while(num){
num = num / 10;
++size;
}
int temp=size-2;//用来确定需要往右移动的位数,(给前边加多少空格)
for(int l=0;l<n;l++){
cout<<setw(3*x)<<"";//在每行前输入宽度为3x的空格
x--;//每行-1
for(int k=0;k<=l;k++){
cout<<arr[l][k]<<setw(size+1);//输出数组每个数的宽度是最大数位数加1
}
cout<<endl;
}
// 1 右移3位
// 1 1 右移2位
// 1 2 1 右移1位
// 1 3 3 1
}
1 2021年10月23日16:43:39
|