文章目录
DAY2
杨辉三角
【题目描述】
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
【输入格式】
输入包含一个数n。
【输出格式】
输入杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
【输入样例】
4
【输出样例】
1
1 1
1 2 1
1 3 3 1
【数据规模与约定】
1 <= n <= 34
【解题思路】
使用二维数组,先将每个一维数组的第一个数和最后一个数都设置为1,然后根据三角形中的每个数等于它两肩膀数字的和的特性进行计算。
【C++程序代码】
方法一:使用数组
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cin >> n;
int arr[34][34] = { 0 };
for (int i = 0; i < 34; i++)
{
arr[i][0] = arr[i][i] = 1;
}
for (int i = 2; i < 34; i++)
{
for (int j = 1; j < i; j++)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
cout << arr[i][j] << ' ';
}
cout << endl;
}
return 0;
}
方法二:使用vector容器
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<vector<int>> vv(n);
for (int i = 0; i < n; i++)
{
vv[i].resize(i + 1, 1);
}
for (int i = 2; i < n; i++)
{
for (int j = 1; j < i; j++)
{
vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
cout << vv[i][j] << ' ';
}
cout << endl;
}
return 0;
}
查找整数
【题目描述】
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
【输入格式】
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
【输出格式】
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
【输入样例】
6
1 9 4 8 3 9
9
【输出样例】
2
【数据规模与约定】
1 <= n <= 1000
【解题思路】
将数列的数字逐个输入进容器中,然后再逐个进行对比
【C++程序代码】
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++)
{
int tmp;
cin >> tmp;
v[i] = tmp;
}
int findNum;
cin >> findNum;
int i;
for (i = 0; i < n; i++)
{
if (v[i] == findNum)
{
break;
}
}
if (i == n)
{
cout << -1;
}
else
{
cout << ++i;
}
cout << endl;
return 0;
}
数列特征
【题目描述】
给出n个数,找出这n个数的最大值,最小值,和。
【输入格式】
第一行为整数n,表示数的个数。
第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。
【输出格式】
输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。
【输入样例】
5
1 3 -2 4 5
【输出样例】
5
-2
11
【数据规模与约定】
1 <= n <= 10000
【解题思路】
题目规定了输入的数字的绝对值都小于-10000,所有设最大值和最小值分别为正负10000,只要有大于或者小于的就进行替换。
【C++程序代码】
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> v(n);
int sum = 0;
int max = -10000;
int min = 10000;
for (int i = 0; i < n; i++)
{
cin >> v[i];
sum += v[i];
if (v[i] > max)
{
max = v[i];
}
if (v[i] < min)
{
min = v[i];
}
}
cout << max << endl;
cout << min << endl;
cout << sum << endl;
return 0;
}
字母图形(未通过全部样例)
【题目描述】
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
【输入格式】
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
【输出格式】
输出n行,每个m个字符,为你的图形。
【输入样例】
5 7
【输出样例】
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
【数据规模与约定】
1 <= n <= 10000
【解题思路】
用一个容器先输入第一行的所有字符,通过观看样例输出我们可以得出结论,根据行号的变化,每次前n个字符+1,后m-n个字符+1。
【C++程序代码】
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
vector<char> v(m);
for (int i = 0; i < m; i++)
{
v[i] = 'A' + i;
}
for (int i = 0; i < n; i++)
{
if (i > 0)
{
for (int j = 0; j < i; j++)
{
v[j]++;
}
for (int j = i; j < m; j++)
{
v[j]--;
}
}
for (int j = 0; j < m; j++)
{
cout << v[j] << " ";
}
cout << endl;
}
return 0;
}