ZZNUOJ(C/C++)基础练习1041——1050(详解版)
1041 : 数列求和2
题目描述
输入一个整数n,输出数列1-1/3+1/5-……前n项的和。
输入
输入只有一个整数n。
输出
结果保留2为小数,单独占一行。
样例输入
3
样例输出
0.87
注意sum += 1相当于sum=sum+1
注意sum *= 1相当于sum=sum*1
C语言版
#include<stdio.h> // 包含标准输入输出库
#include<math.h> // 包含数学库(虽然在这个程序中没有用到数学库的功能)
int main() // 主函数
{
int n, i; // 定义两个整型变量n和i,用于存储用户输入的项数和循环计数
double sum = 0, mid = -1; // 定义两个双精度浮点型变量sum和mid,分别用于存储数列和和交替符号的项
scanf("%d", &n); // 从用户输入中读取一个整数,存储到变量n中
// 计算数列和
for (i = 1; i <= n; i++) // 从1到n循环
{
mid *= -1.0; // 交替符号
sum += mid / (2 * i - 1); // 计算当前项并加到sum上
}
printf("%.2f\n", sum); // 输出数列和,保留两位小数
return 0; // 程序正常结束
}
C++版
#include<iostream> // 包含标准输入输出流库
#include<iomanip> // 包含输入输出流格式化库
using namespace std; // 使用标准命名空间std
int main() // 主函数
{
int n, i; // 定义两个整型变量n和i,用于存储用户输入的项数和循环计数
double sum = 0, mid = -1; // 定义两个双精度浮点型变量sum和mid,分别用于存储数列和和交替符号的项
cin >> n; // 从标准输入读取一个整数,存储到变量n中
// 计算数列和
for (i = 1; i <= n; i++) // 从1到n循环
{
mid *= -1.0; // 交替符号
sum += mid / (2 * i - 1); // 计算当前项并加到sum上
}
cout << setprecision(2) << fixed << sum << endl; // 使用setprecision(2)和fixed设置小数精度为2位,并输出数列和
return 0; // 程序正常结束
}
1042 : 数列求和3
题目描述
求1-2/3+3/5-4/7+5/9-6/11+...的前n项和,结果保留3位小数。
输入
输入正整数n(n>0)。
输出
输出一个实数,保留3位小数,单独占一行。
样例输入
5
样例输出
0.917
C语言版
#include<stdio.h> // 包含标准输入输出库
int main() // 主函数
{
int n, i; // 定义两个整型变量n和i,用于存储用户输入的项数和循环计数
double sum = 0, mid = -1; // 定义两个双精度浮点型变量sum和mid,分别用于存储数列和和交替符号的项
scanf("%d", &n); // 从用户输入中读取一个整数,存储到变量n中
// 计算数列和
for (i = 1; i <= n; i++) // 从1到n循环
{
mid *= -1.0; // 交替符号
sum += mid * i / (2 * i - 1); // 计算当前项并加到sum上
}
printf("%.3f\n", sum); // 输出数列和,保留三位小数
return 0; // 程序正常结束
}
C++版
#include<iostream> // 包含标准输入输出流库
#include<iomanip> // 包含输入输出流格式化库
using namespace std; // 使用标准命名空间std
int main() // 主函数
{
int n, i; // 定义两个整型变量n和i,用于存储用户输入的项数和循环计数
double sum = 0, mid = -1; // 定义两个双精度浮点型变量sum和mid,分别用于存储数列和和交替符号的项
cin >> n; // 从标准输入读取一个整数,存储到变量n中
// 计算数列和
for (i = 1; i <= n; i++) // 从1到n循环
{
mid *= -1.0; // 交替符号
sum += mid * i / (2 * i - 1); // 计算当前项并加到sum上
}
cout << setprecision(3) << fixed << sum << endl; // 使用setprecision(3)和fixed设置小数精度为3位,并输出数列和
return 0; // 程序正常结束
}
1043 : 最大值
题目描述
输入一个整数n和n个整数,输出这n个整数的最大值。
输入
输入有两行:第一行是一个正整数n,第二行是n个整数。
输出
输出包含一个整数,即n个数中的最大值,单独占一行。
样例输入
4 3 7 5 6
样例输出
7
注意设立变长数组,必须在输入n之后
法一
C语言版
#include<stdio.h> // 包含标准输入输出库
int main() {
int n, i; // 定义变量n用于存储数组大小,i用于循环控制
scanf("%d", &n); // 从输入中读取数组的大小n
int arr[n]; // 定义一个动态数组,大小由用户输入决定
// 从用户输入中读取数组的每个元素
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]); // 逐个读取输入的整数,存储到数组arr中
}
// 初始化最大值变量为数组的第一个元素
int max = arr[0];
// 遍历数组,寻找最大值
for (i = 1; i < n; i++) {
if (arr[i] > max) { // 如果当前元素大于当前最大值
max = arr[i]; // 更新最大值
}
}
// 输出最大值
printf("%d\n", max);
return 0; // 程序正常结束
}
C++版
#include<iostream> // 包含C++标准输入输出流库
using namespace std; // 使用标准命名空间
int main() {
int n, i; // 定义变量n用于存储数组大小,i用于循环控制
cin >> n; // 从标准输入读取数组的大小n
int arr[n]; // 定义一个变长数组,大小由输入决定
// 从用户输入中读取数组的每个元素
for (i = 0; i < n; i++) {
cin>>arr[i]; // 使用cin逐个读取输入的整数,存储到数组arr中
}
// 初始化最大值变量为数组的第一个元素
int max = arr[0];
// 遍历数组,寻找最大值
for (i = 1; i < n; i++) {
if (arr[i] > max) { // 如果当前元素大于当前最大值
max = arr[i]; // 更新最大值
}
}
// 输出最大值
cout << max << endl;
return 0; // 程序正常结束
}
法二(与法一没太大区别)
C语言版
#include<stdio.h> // 包含标准输入输出头文件
int main() {
int n, i, max; // 定义变量:n表示数组大小,i用于循环控制,max用于存储最大值
// 读取数组大小n和数组的第一个元素(初始化最大值)
scanf("%d%d", &n, &max);
int arr[n]; // 定义一个动态数组,大小由用户输入决定
// 从数组的第二个元素开始读取(因为第一个元素已经读取并赋值给max)
for (i = 1; i < n; i++) {
scanf("%d", &arr[i]); // 读取数组的第i个元素
if (arr[i] > max) { // 如果当前元素大于当前最大值
max = arr[i]; // 更新最大值
}
}
// 输出最大值
printf("%d\n", max);
return 0; // 程序正常结束
}
C++版
#include<iostream> // 包含C++标准输入输出流库
using namespace std; // 使用标准命名空间,避免重复书写std::
int main() {
int n, i, max; // 定义变量:n表示数组大小,i用于循环控制,max用于存储最大值
// 从标准输入读取数组的大小n和数组的第一个元素(初始化最大值)
cin >> n >> max;
int arr[n]; // 定义一个动态数组,大小由由输入决定(C++中不推荐使用VLA,但这里为了与C语言兼容)
// 从数组的第二个元素开始读取(因为第一个元素已经读取并赋值给max)
for (i = 1; i < n; i++) {
cin >> arr[i]; // 读取数组的第i个元素
if (arr[i] > max) { // 如果当前元素大于当前最大值
max = arr[i]; // 更新最大值
}
}
// 输出最大值
cout << max << endl;
return 0; // 程序正常结束
}
法三 (排序思想)
C语言版
#include<stdio.h> // 包含标准输入输出头文件
int main() {
int n, i; // 定义变量:n表示数组大小,i用于循环控制
// 从输入中读取数组的大小n
scanf("%d", &n);
int arr[n]; // 定义一个变长数组(VLA),大小由输入决定
// 从输入中读取数组的每个元素
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]); // 逐个读取输入的整数,存储到数组arr中
}
// 使用冒泡排序的思想,将数列最大值转移到最后一个元素
for (i = 0; i < n-1; i++) {
if (arr[i] > arr[i+1]) { // 如果当前元素大于下一个元素
int mid = arr[i]; // 交换两个元素的位置
arr[i] = arr[i+1];
arr[i+1] = mid;
}
}
// 输出最大值(位于数组的最后一个位置)
printf("%d\n", arr[n-1]);
return 0; // 程序正常结束
}
C++版(可使用容器vector替换数组)
#include<iostream> // 包含C++标准输入输出流库
using namespace std;
int main() {
int n, i; // 定义变量:n表示数组大小,i用于循环控制
// 从标准输入读取数组的大小n
cin >> n;
int arr[n]; // 定义一个变长数组,大小由输入决定
// 从标准输入读取数组的每个元素
for (i = 0; i < n; i++) {
cin >> arr[i]; // 逐个读取输入的整数,存储到数组arr中
}
// 使用冒泡排序的思想,将数列最大值转移到最后一个元素
for (i = 0; i < n - 1; i++) {
if (arr[i] > arr[i + 1]) { // 如果当前元素大于下一个元素
int mid = arr[i]; // 交换两个元素的位置
arr[i] = arr[i + 1];
arr[i + 1] = mid;
}
}
// 输出最大值(位于数组的最后一个位置)
cout << arr[n - 1] << endl;
return 0; // 程序正常结束
}
法四(使用C++的nth_element函数)
了解nth_element函数:nth_element函数——C++快速选择函数-CSDN博客
#include<iostream> // 包含标准输入输出流库
#include<algorithm> // 包含算法库,用于使用 nth_element
using namespace std; // 使用标准命名空间
int main()
{
int n, i; // 定义变量 n 和 i,分别用于存储数组大小和循环索引
cin >> n; // 输入数组的大小
int arr[n]; // 定义一个动态数组,存储 n 个整数(C++11之前 不推荐这样定义动态数组)
for(i = 0; i < n; i++) // 循环输入数组的每个元素
{
cin >> arr[i]; // 输入数组元素
}
nth_element(arr, arr + n - 1, arr + n); // 调用 nth_element,将第 n 小的元素(即最大值)放到第n个位置(对应下标为n-1)
cout << arr[n - 1] << endl; // 输出第 n 小的元素(即数组中的最大值)
return 0; // 程序结束
}
下面这个代码逻辑运算是对的,但在oj上过不了
#include<iostream> // 包含标准输入输出流库
#include<algorithm> // 包含算法库,用于使用 nth_element
using namespace std; // 使用标准命名空间
int main()
{
int n, i; // 定义变量 n 和 i,分别用于存储数组大小和循环索引
cin >> n; // 输入数组的大小
vector<int> arr(n); // 使用 vector 定义动态数组,存储 n 个整数
for(i = 0; i < n; i++) // 循环输入数组的每个元素
{
cin >> arr[i]; // 输入数组元素
}
nth_element(arr.begin(), arr.begin() + n - 1, arr.end()); // 调用 nth_element
// 这里的目的是找到数组中第 n 小的元素(即数组中的最大值)
// nth_element 会将第 n 小的元素放到 arr[n-1] 的位置上
// 并且保证 arr[n-1] 之前的元素都不大于 arr[n-1]
cout << arr[n - 1] << endl; // 输出第 n 小的元素(即数组中的最大值)
return 0; // 程序结束
}
法五(使用C++的max_element函数,涉及到数组指针)
max_element
函数会返回指向数组中最大元素的指针,然后通过解引用指针*a
来输出最大值。了解max_element函数:简要介绍C++中的 max 和 min 函数以及返回值-CSDN博客
#include<iostream> // 包含标准输入输出流库
#include<algorithm> // 包含算法库,用于使用 max_element
using namespace std; // 使用标准命名空间
int main()
{
int n, i; // 定义变量 n 和 i,分别用于存储数组大小和循环索引
cin >> n; // 输入数组的大小
int arr[n]; // 定义一个动态数组,存储 n 个整数
for(i = 0; i < n; i++) // 循环输入数组的每个元素
{
cin >> arr[i]; // 输入数组元素
}
int* a = max_element(arr, arr + n); // 使用 max_element 找到数组中的最大值
// max_element 返回指向数组中最大元素的指针
cout << (*a) << endl; // 输出最大值
return 0; // 程序结束
}