信息学奥赛一本通C++ - 第二章 - 第五节 顺序结构实例

2070:【例2.13】数字对调

题目描述

输入一个三位数,然后把该数的百位和个位对调,输出对调后的数字。

解题思路

对于一个三位数,我们可以通过数学运算分离出百位、十位和个位:

  • 百位可以通过整除100得到。
  • 个位可以通过对10取余得到。
  • 十位可以通过先对100取余,再整除10得到。

对调百位和个位后,重新组合这三个数字得到新的三位数。

代码实现
#include <iostream>
using namespace std;

int main() {
    int num;
    cin >> num;  // 从输入读取一个三位数

    // 提取百位、十位和个位
    int hundreds = num / 100;
    int tens = (num / 10) % 10;
    int units = num % 10;

    // 对调百位和个位
    int swappedNum = units * 100 + tens * 10 + hundreds;

    // 输出对调后的结果
    cout << swappedNum << endl;

    return 0;
}
代码解析
  • int hundreds = num / 100; 计算百位数字。
  • int tens = (num / 10) % 10; 计算十位数字。
  • int units = num % 10; 计算个位数字。
  • 对调后,units 成为新的百位,hundreds 成为新的个位,tens 保持不变作为十位。
  • 使用表达式 units * 100 + tens * 10 + hundreds 来组合新的三位数。
  • 输出对调后的结果。

这段程序通过简单的数学运算实现了三位数的百位和个位的对调,并能够准确地输出对调后的数值。

2071:【例2.14】平均分

题目描述

已知某班有男同学 x 位,女同学 y 位,男生平均分是87分,女生平均分是85分。根据给定的男女同学人数,计算全体同学的平均分并保留四位小数。

解题思路

为了计算全班的平均分:

  1. 首先,根据男女生人数及各自的平均分,计算男生和女生总分。
  2. 然后,将男女生总分相加得到班级总分。
  3. 最后,将班级总分除以总人数得到全班平均分。
代码实现
#include <iostream>
#include <iomanip>  // 包含用于格式化输出的库
using namespace std;

int main() {
    int x, y;  // x代表男生人数,y代表女生人数
    cin >> x >> y;  // 输入男女同学人数

    // 男女生平均分已知
    int avgMale = 87, avgFemale = 85;

    // 计算男女生总分
    int totalMaleScore = x * avgMale;
    int totalFemaleScore = y * avgFemale;

    // 计算全班总分
    int totalScore = totalMaleScore + totalFemaleScore;

    // 计算全班平均分
    double averageScore = static_cast<double>(totalScore) / (x + y);

    // 输出平均分,保留4位小数
    cout << fixed << setprecision(4) << averageScore << endl;

    return 0;
}
代码解析
  • 使用 cin 读取男生和女生的人数。
  • 男生和女生的平均分分别为87分和85分,分别计算男生和女生的总分。
  • 计算全班的总分,并根据全班的人数计算平均分。
  • 使用 cout << fixed << setprecision(4) 控制输出格式,确保平均分保留四位小数。

这段代码通过基本的数学运算和适当的类型转换(使用 static_cast<double> 保证在除法时不丢失精度),有效地计算出了全班同学的平均分,并且以四位小数的精度输出了结果。

2072:【例2.15】歌手大奖赛

题目描述

在一次歌手大奖赛中,6名评委给一位参赛者打分。全体评委的平均分为9.6分。如果去掉一个最高分,则平均分变为9.4分;如果去掉一个最低分,则平均分变为9.8分。求如果同时去掉一个最高分和一个最低分后,这名参赛者的平均分是多少?

解题思路
  1. 计算总分
    • 使用全体评委的平均分计算所有评委的总分。
  2. 计算去掉最高分和最低分后的总分
    • 分别使用去掉最高分和最低分的平均分计算相应的总分,以此推算最高分和最低分的具体数值。
  3. 计算去掉最高分和最低分的新平均分
    • 基于计算出的最高分和最低分,更新总分,并计算新的平均分。
具体步骤与公式
  • 设初始总分 ( S = 6 \times 9.6 )
  • 去掉最高分的总分 ( S_{high} = 5 \times 9.4 )
  • 去掉最低分的总分 ( S_{low} = 5 \times 9.8 )
  • 计算最高分和最低分:
    • 最高分 ( high = S - S_{high} )
    • 最低分 ( low = S - S_{low} )
  • 计算去掉最高分和最低分后的总分 ( S_{final} = S - high - low )
  • 计算新的平均分 ( avg_{final} = S_{final} / 4 )
代码实现
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    // 计算初始总分
    double totalScore = 6 * 9.6;

    // 计算去掉一个最高分和最低分的总分
    double totalWithoutHighest = 5 * 9.4;
    double totalWithoutLowest = 5 * 9.8;

    // 推算最高分和最低分
    double highestScore = totalScore - totalWithoutHighest;
    double lowestScore = totalScore - totalWithoutLowest;

    // 计算去除最高和最低分后的总分
    double totalFinal = totalScore - highestScore - lowestScore;

    // 计算新的平均分
    double finalAverage = totalFinal / 4;

    // 输出结果,保留两位小数
    cout << fixed << setprecision(2);
    cout << finalAverage << endl;

    return 0;
}
代码解析
  • 首先计算了评委总分和去掉最高分、最低分的总分,再根据这些信息推算出最高分和最低分。
  • 根据去掉最高分和最低分后的评分总数计算出最终的平均分。
  • 使用 setprecision(2) 控制输出精度为两位小数,符合题目要求。

这种解题方法通过算术计算和对题目信息的解析来有效地求解,确保输出准确。

2073:【例2.16 】三角形面积

题目描述

使用海伦公式计算给定三边长的三角形的面积。海伦公式利用三角形的三条边长求取面积,公式为:
[ s = \sqrt{p(p-a)(p-b)(p-c)} ]
其中 ( p ) 是半周长,计算公式为:
[ p = \frac{a+b+c}{2} ]

解题思路
  1. 计算半周长:首先根据输入的三条边长计算三角形的半周长 ( p )。
  2. 应用海伦公式:使用海伦公式计算三角形的面积。
  3. 格式化输出:输出计算得到的面积,保留三位小数。
代码实现
#include <iostream>
#include <iomanip>  // 包含用于格式化输出的库
#include <cmath>    // 包含用于计算平方根的库
using namespace std;

int main() {
    double a, b, c;
    cin >> a >> b >> c;  // 从输入读取三角形的三边长

    // 计算半周长
    double p = (a + b + c) / 2.0;

    // 使用海伦公式计算面积
    double area = sqrt(p * (p - a) * (p - b) * (p - c));

    // 输出面积,保留3位小数
    cout << fixed << setprecision(3) << area << endl;

    return 0;
}
代码解析
  • 使用 cin 读取三角形的三条边长。
  • 计算半周长 ( p )。
  • 使用 sqrt 函数和海伦公式计算三角形的面积。
  • 使用 cout << fixed << setprecision(3) 控制输出格式,确保面积输出为三位小数。

这段代码通过对三边长的简单数学运算计算出三角形的面积,并准确地按照要求格式输出。

1029:计算浮点数相除的余

题目描述

给定两个双精度浮点数 (a) 和 (b),要求计算它们相除的余数。这里的余数 (r) 的定义是:(a = k \times b + r),其中 (k) 是使得 (r) 最小的整数,且 (0 \leq r < b)。

解题思路

要计算浮点数相除的余数,我们可以使用以下方法:

  1. 首先,确定 (a) 和 (b) 相除的整数部分 (k),这可以通过取整操作实现。
  2. 然后,根据余数的定义 (r = a - k \times b),计算余数。

这种计算余数的方法遵循定义:(a = k \times b + r),且确保 (0 \leq r < b)。

代码实现
#include <iostream>
#include <cmath>    // 包括用于计算floor和fmod的库
#include <iomanip>  // 包括用于格式化输出的库
using namespace std;

int main() {
    double a, b;
    cin >> a >> b;  // 从输入读取两个双精度浮点数

    // 计算整数部分k
    int k = static_cast<int>(floor(a / b));

    // 计算余数r
    double r = fmod(a, b);

    // 输出余数,保留4位小数
    cout << fixed << setprecision(4) << r << endl;

    return 0;
}
代码解析
  • 使用 cin 读取两个浮点数 (a) 和 (b)。
  • 使用 floor 函数计算 (a / b) 的整数部分 (k)。这里使用 floor 确保 (k) 是向下取整,符合 (k \times b \leq a) 的条件。
  • 使用 fmod 函数计算 (a) 除以 (b) 的余数 (r)。fmod 直接计算浮点数除法的余数,确保结果的精确性。
  • 使用 cout << fixed << setprecision(4) 控制输出格式,确保余数输出为四位小数。

这段代码能够准确地计算出两个浮点数相除的余数,并以指定的精度格式输出。

1030:计算球的体积

题目描述

给定一个球的半径 ( r ),用公式 ( V = \frac{4}{3} \pi r^3 ) 计算球的体积。这里使用 ( \pi = 3.14 )。输出球的体积,并保留两位小数。

解题思路

要计算球的体积,我们首先需要球的半径 ( r )。使用给定的公式:
[ V = \frac{4}{3} \pi r^3 ]
其中 ( \pi ) 取值为 3.14,这是数学中常用的圆周率近似值。通过计算这个公式,我们可以得到球的体积。然后,输出结果时保留两位小数。

代码实现
#include <iostream>
#include <iomanip>  // 包括用于格式化输出的库
using namespace std;

int main() {
    double r;  // 球的半径
    cin >> r;  // 从输入读取球的半径

    const double pi = 3.14;  // 圆周率的近似值
    double volume = (4.0 / 3.0) * pi * r * r * r;  // 计算球的体积

    // 输出球的体积,保留两位小数
    cout << fixed << setprecision(2) << volume << endl;

    return 0;
}
代码解析
  • 使用 cin 读取球的半径 ( r )。
  • 定义并使用常数 pi 作为圆周率的近似值。
  • 计算球的体积 ( V ) 通过公式 ( V = \frac{4}{3} \pi r^3 )。
  • 使用 cout << fixed << setprecision(2) 控制输出格式,确保体积输出保留两位小数。

这段代码能够准确地计算和输出一个球的体积,结果精确到小数点后两位。该程序简洁有效,符合数学计算的要求,并确保了输出的准确性和可读性。

1031:反向输出一个三位数

题目描述

输入一个三位数 ( n ),要求将这个数反向输出。例如,输入 358,应输出 853。

解题思路

要将一个三位数反向输出,可以通过数学方法或字符串操作实现。这里采用数学方法,分解出每一位数字,然后重新组合成反向的数字:

  1. 提取个位数:使用模运算 ( n % 10 )。
  2. 提取十位数:先除以 10 再模 10。
  3. 提取百位数:直接除以 100。
  4. 重新组合:个位数成为新的百位数,十位数成为新的十位数,百位数成为新的个位数。
代码实现
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    int n;
    cin >> n;  // 读取一个三位数

    // 提取个位、十位和百位
    int units = n % 10;
    int tens = (n / 10) % 10;
    int hundreds = n / 100;

    // 重新组合数字,反向输出
    int reversedNumber = units * 100 + tens * 10 + hundreds;

    // 输出反向的数字,保持三位输出
    cout << setfill('0') << setw(3) << reversedNumber << endl;

    return 0;
}
代码解析
  • 使用 cin 读取输入的三位数。
  • 分别提取出个位数、十位数和百位数。
  • 将提取出的数字按照反向顺序重新组合。
  • 使用 cout 输出结果,使用 setw(3)setfill('0') 确保输出为三位数,即使前面有0也会显示,符合题目要求。

这段程序不仅能够准确地反向输出一个三位数,而且还能保证输出格式正确,即使是像100这样的数字也能正确输出为001。

1032:大象喝水问题

题目描述

一只大象要喝 20 升水才能解渴,但是只有一个特定尺寸的圆桶可用来盛水。已知桶的高度为 ( h ) 厘米,底面半径为 ( r ) 厘米,求大象至少需要多少桶水才能解渴。

解题思路

首先,需要根据圆桶的尺寸计算出桶的体积。体积公式为:
[ V = \pi r^2 h ]
其中 ( V ) 是体积,( r ) 是半径,( h ) 是高度,且 (\pi \approx 3.14159)。

  1. 计算单桶体积:首先计算出一个桶的体积(单位:立方厘米)。
  2. 转换体积单位:将体积从立方厘米转换为升(1升 = 1000立方厘米)。
  3. 计算所需桶数:使用总体积除以单桶体积,并向上取整,得到大象需要的桶数。
代码实现
#include <iostream>
#include <cmath>    // 包含用于数学计算的库
using namespace std;

int main() {
    int h, r;
    cin >> h >> r;  // 读取桶的深度和半径

    const double pi = 3.14159;  // 圆周率的近似值
    double volumePerBucket = pi * r * r * h;  // 单个桶的体积(立方厘米)
    double litersPerBucket = volumePerBucket / 1000.0;  // 单个桶的体积转换为升

    int bucketsNeeded = ceil(20.0 / litersPerBucket);  // 计算所需的桶数

    cout << bucketsNeeded << endl;  // 输出所需的桶数

    return 0;
}
代码解析
  • 使用 cin 读取输入的高度 ( h ) 和半径 ( r )。
  • 计算一个桶的体积,并将其从立方厘米转换为升。
  • 使用 ceil 函数确保结果向上取整,因为即使只超出一点,也需要额外一桶水。
  • 输出大象需要的桶数。

这个程序能够准确地根据给定的桶尺寸计算出大象解渴所需的最小桶数,并且以整数形式输出。

1033:计算线段长度

题目描述

给定两个点 A(Xa, Ya) 和 B(Xb, Yb),计算线段 AB 的长度并保留到小数点后三位。

解题思路

线段的长度可以通过两点间的欧几里得距离公式计算:
[ \text{Distance} = \sqrt{(Xb - Xa)^2 + (Yb - Ya)^2} ]
其中 (Xa, Ya) 是点 A 的坐标,(Xb, Yb) 是点 B 的坐标。

  1. 读取两点坐标:首先从输入中获取两点的坐标。
  2. 应用距离公式:使用两点间的坐标差计算距离。
  3. 格式化输出:输出结果时保留三位小数。
代码实现
#include <iostream>
#include <cmath>    // 包括用于计算平方根的库
#include <iomanip>  // 包括用于格式化输出的库
using namespace std;

int main() {
    double Xa, Ya, Xb, Yb;
    cin >> Xa >> Ya;  // 读取点A的坐标
    cin >> Xb >> Yb;  // 读取点B的坐标

    // 计算两点间的欧几里得距离
    double distance = sqrt((Xb - Xa) * (Xb - Xa) + (Yb - Ya) * (Yb - Ya));

    // 输出距离,保留3位小数
    cout << fixed << setprecision(3) << distance << endl;

    return 0;
}
代码解析
  • 使用 cin 读取两个点的坐标。
  • 使用数学库中的 sqrt 函数计算两点间的距离。
  • 使用 cout << fixed << setprecision(3) 控制输出格式,确保距离输出保留三位小数。

这个程序能够准确地计算出两点间的距离,并以精确到小数点后三位的格式输出,满足题目要求。

1034:计算三角形面积

题目描述

给定平面上一个三角形的三个顶点坐标 ((x1, y1), (x2, y2), (x3, y3)),计算这个三角形的面积并保留到小数点后两位。

解题思路

三角形的面积可以使用向量叉乘公式计算,当给定三个顶点坐标时,面积 (A) 可以通过以下公式计算:
[ A = \frac{1}{2} \left| x1(y2 - y3) + x2(y3 - y1) + x3(y1 - y2) \right| ]

这个公式是基于线性代数中的行列式来计算平行四边形的面积的一半,其中 ( (x1, y1), (x2, y2), (x3, y3) ) 是三角形的顶点坐标。

代码实现
#include <iostream>
#include <cmath>    // 包括用于计算绝对值的库
#include <iomanip>  // 包括用于格式化输出的库
using namespace std;

int main() {
    double x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;  // 读取三个顶点的坐标

    // 使用叉乘公式计算三角形的面积
    double area = abs(x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0;

    // 输出面积,保留两位小数
    cout << fixed << setprecision(2) << area << endl;

    return 0;
}
代码解析
  • 使用 cin 读取三个顶点的坐标。
  • 根据向量叉乘的面积公式计算三角形的面积,使用 abs 函数确保面积为正值。
  • 使用 cout << fixed << setprecision(2) 控制输出格式,确保面积输出保留两位小数。

这段代码能够准确地计算出三角形的面积,即使顶点坐标以不同的顺序输入也能正确处理,因为公式的结果始终是正的。输出结果精确到小数点后两位。

1035:等差数列末项计算

题目描述

给定等差数列的前两项 (a_1) 和 (a_2),要求计算第 (n) 项的值。

解题思路

等差数列的第 (n) 项 (a_n) 可以通过以下公式计算:
[ a_n = a_1 + (n-1) \cdot d ]
其中 (d) 是公差,可由前两项得出:
[ d = a_2 - a_1 ]

通过这个公式,我们可以直接求出第 (n) 项的值。

代码实现
#include <iostream>
using namespace std;

int main() {
    int a1, a2, n;
    cin >> a1 >> a2 >> n;  // 读取输入的等差数列的前两项和项数

    // 计算公差
    int d = a2 - a1;

    // 计算第n项
    int an = a1 + (n - 1) * d;

    // 输出第n项
    cout << an << endl;

    return 0;
}
代码解析
  • 使用 cin 读取等差数列的前两项 (a_1) 和 (a_2) 以及项数 (n)。
  • 计算公差 (d = a_2 - a_1)。
  • 根据等差数列的第 (n) 项公式 (a_n = a_1 + (n-1) \cdot d) 计算第 (n) 项。
  • 输出第 (n) 项的值。

这段代码能够准确地计算出等差数列的任何一项,无论数列的进展如何,确保了算法的简单性和效率。

1036:A×B问题

题目描述

给定两个正整数 ( A ) 和 ( B ),计算它们的乘积 ( A \times B )。

解题思路

由于输入的两个数 ( A ) 和 ( B ) 的范围分别在 1 到 50000 之间,直接计算乘积是安全的,因为最大的乘积是 ( 50000 \times 50000 = 2500000000 ),这在 C++ 的 int 数据类型范围内(可达到约 21 亿)。因此,直接读取两个数,计算它们的乘积,并输出结果即可。

代码实现
#include <iostream>
using namespace std;

int main() {
    int A, B;
    cin >> A >> B;  // 从输入读取两个正整数 A 和 B

    // 计算 A 和 B 的乘积
    int product = A * B;

    // 输出乘积结果
    cout << product << endl;

    return 0;
}
代码解析
  • 使用 cin 读取两个正整数 ( A ) 和 ( B )。
  • 计算这两个数的乘积 ( A \times B )。
  • 使用 cout 输出计算得到的乘积。

这段代码简洁且高效地实现了题目要求,可以准确地计算并输出两个正整数的乘积。考虑到乘积的数据范围,使用 int 类型足够处理可能的最大输入。

1037:计算2的幂

题目描述

输入一个非负整数 ( n ),求 ( 2^n ) 的值。

解题思路

这个问题可以通过简单的位移操作解决。在计算机科学中,左移一位相当于乘以2。因此,将数字1左移 ( n ) 位即可得到 ( 2^n )。这种方法比直接使用幂运算更快且直接。

代码实现
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;  // 从输入读取指数 n

    // 使用位移操作计算 2^n
    int result = 1 << n;  // 将1左移n位

    // 输出结果
    cout << result << endl;

    return 0;
}
代码解析
  • 使用 cin 读取输入的指数 ( n )。
  • 使用位移操作 1 << n 计算 ( 2^n )。位移操作在这里非常适用,因为它直接在二进制层面上将1向左移动 ( n ) 位,从而快速得到结果。
  • 使用 cout 输出结果。

这段代码高效地计算了 ( 2^n ) 并输出,充分利用了位运算的优势,特别是在计算幂的问题上,位运算比传统的乘法或幂函数更为高效。

1038:苹果和虫子

题目描述

给定一箱苹果的总数 ( n ),一条虫子每 ( x ) 小时会吃掉一个苹果,计算在 ( y ) 小时后剩下多少个完整的苹果。

解题思路

根据提供的代码,逻辑如下:

  1. 使用 ceil(y / x) 计算在 ( y ) 小时内虫子可以吃掉的苹果数,确保即使 ( y/x ) 不是整数时也能正确地向上取整,表示虫子在该时间内至少可以吃掉这么多苹果。
  2. 从苹果总数 ( n ) 中减去吃掉的苹果数得到剩余的苹果数。
  3. 如果计算出的剩余苹果数小于 0,则将剩余苹果数设为 0。
代码解析

代码已经整合上述逻辑,具体如下:

#include <iostream>
#include <cmath>  // 使用cmath而非math.h,因为cmath是C++中更现代的库
using namespace std;

int main() {
    int n;      // 苹果总数
    double x, y; // x 是虫子每吃掉一个苹果的时间间隔,y 是总时间
    cin >> n >> x >> y; // 从输入读取数据

    int sum; // 计算剩余的苹果数
    sum = n - ceil(y / x); // 向上取整计算虫子吃掉的苹果数并从总数中减去

    if (sum < 0) sum = 0; // 如果计算出的苹果数为负,则设为 0

    cout << sum; // 输出剩余的苹果数
    return 0;
}

这段代码确保了在任何情况下都不会出现剩余苹果数为负的情况,并且考虑到了吃苹果时间可能不整除总时间的情况。使用 ceil 函数确保每次都至少计算出虫子会吃掉的苹果数,从而不会低估虫子的食量。

  • 39
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天秀信奥编程培训

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值