信息学奥赛一本通 1029:计算浮点数相除的余 | OpenJudge NOI 1.3 11

【题目链接】

ybt 1029:计算浮点数相除的余
OpenJudge NOI 1.3 11:计算浮点数相除的余数

【题目考点】

1. 输出浮点型量,小数尾部没有多余的0

假设有double x = 1.300;
cout<<x;//输出1.3
printf("%g", x);//输出1.3

2. 浮点型量向下取整方法
  • 强制转换为整型 int(x)
  • 调用floor()函数(注意:floor()返回double类型)

【解体思路】

这里余数(r)的定义是:a = k * b + r,其中k是整数,a > 0, b > 0, 0 <= r < b。
可以理解为,a中至多包含k个b。所以有k为a / b的值向下取整。
将该等式变换为:r = a - k * b,即可求出余数r

【题解代码】

解法1:使用cin,cout进行输入输出

使用强制类型转换

#include <bits/stdc++.h>
using namespace std;
int main()
{
	double a, b;
	cin>>a>>b;
	cout<<a - int(a/b) * b;//或a - floor(a/b) * b
	return 0;
}
解法2:使用scanf,printf进行输入输出
#include <bits/stdc++.h>
using namespace std;
int main()
{
	double a, b;
	scanf("%lf %lf", &a, &b);
	printf("%g", a - int(a/b) * b);//或a - floor(a/b) * b
	return 0;
}
### 关于PTA甲级1029题目的解析 #### 题目描述 PTA甲级1029题目名为 **"Median"**,其主要目标是计算一组数的中位数。具体来说,给定一系列整数,要求按照从小到大的顺序排列这些整数,并返回其中位数。 - 如果序列长度为奇数,则中位数为中间位置的那个数; - 如果序列长度为偶数,则中位数为中间两个数的平均值。 以下是更详细的输入输出说明: #### 输入规格 输入的第一行为一个正整数 \(N\) (\(1 \leq N \leq 10^5\)),表示后续待处理的数据数量。 第二行为 \(N\) 个由空格分隔的整数,范围在 \([-10^6, 10^6]\) 内。 #### 输出规格 输出一行,包含一个浮点数,保留一位小数,表示该组数据的中位数。 --- #### 解决方案 为了高效求解此问题,可以采用以下方法: 1. 使用 C++ 的 `std::vector` 或 Python 的列表来存储输入数据。 2. 对数组进行排序操作,时间复杂度为 \(O(N \log N)\),这是必要的步骤以便找到中位数的位置。 3. 判断数组长度的奇偶性: - 若为奇数,直接取中间索引对应的数值作为中位数。 - 若为偶数,取中间两个数的均值作为中位数。 下面是基于上述逻辑实现的具体代码示例: ```cpp #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int N; cin >> N; vector<int> nums(N); for (int i = 0; i < N; ++i) { cin >> nums[i]; } sort(nums.begin(), nums.end()); double median; if (N % 2 == 1) { // 奇数情况 median = static_cast<double>(nums[N / 2]); } else { // 偶数情况 median = (static_cast<double>(nums[(N / 2) - 1]) + static_cast<double>(nums[N / 2])) / 2.0; } printf("%.1f\n", median); // 控制输出精度至小数点后一位 return 0; } ``` 对于 Python 实现版本,也可以非常简洁地完成相同功能: ```python import sys def find_median(): input_data = sys.stdin.read() lines = input_data.splitlines() n = int(lines[0]) numbers = list(map(int, lines[1].split())) numbers.sort() if n % 2 == 1: median = float(numbers[n // 2]) else: mid1 = numbers[n // 2 - 1] mid2 = numbers[n // 2] median = (mid1 + mid2) / 2 print(f"{median:.1f}") find_median() ``` 以上两种语言的解决方案都能满足题目需求,并且具有较高的效率[^1]。 --- #### 测试案例 假设输入如下: ``` 5 1 3 5 2 4 ``` 经过排序后的序列为 `[1, 2, 3, 4, 5]`,因此中位数为第 3 个元素即 `3.0`。 如果输入改为: ``` 6 1 3 5 2 4 6 ``` 则排序后得到 `[1, 2, 3, 4, 5, 6]`,此时中位数为 `(3 + 4) / 2 = 3.5`。 --- #### 性能优化提示 尽管标准算法已经足够快速,但在极端情况下(如接近最大输入规模),仍需注意内存分配和 I/O 效率。例如,在 C++ 中可以过提前预留向量大小减少动态扩展开销;而在 Python 中可考虑使用更快的文件读写方式替代默认的标准输入流[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值