1 条题解
-
0
题意分析
题目要求基于数论中的一个经典结论:
从随机整数集合中任取两数,其互质的概率为 。
给定若干数据集(每组包含个正整数),需完成:
1、计算每组中所有可能的数对(组合个)
2、统计其中互质数对的数量
3、根据概率公式反推的估计值:
$\pi \approx \sqrt{6/\text{互质概率}} = \sqrt{6 \times \text{总对数}/\text{互质对数}}$
4、若没有互质数对,输出特定提示。解题思路
1、关键公式:
互质概率
推导得 $\pi = \sqrt{6/P} = \sqrt{6 \times \text{总对数}/\text{互质对数}}$
2、核心操作:
遍历所有数对 (),用欧几里得算法计算
统计为的数对数量
3、边界处理:
若互质对数为,无法计算,输出提示信息实现步骤
1、输入处理:
循环读取每个数据集的值,直到终止
对每个数据集,读取个正整数存入数组
2、数对遍历:
双重循环枚举所有个数对
3、计算:
对每个数对,计算其最大公约数
4、统计与计算:
若为,互质计数器加
最终用公式计算值,保留位小数
5、输出结果:
根据互质对数是否为零选择输出或提示信息#include <iostream> #include <vector> #include <cmath> #include <iomanip> using namespace std; int gcd(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a; } int main() { int N; while (cin >> N && N != 0) { vector<int> nums(N); for (int i = 0; i < N; ++i) { cin >> nums[i]; } int coprime_pairs = 0, total_pairs = 0; for (int i = 0; i < N; ++i) { for (int j = i + 1; j < N; ++j) { if (gcd(nums[i], nums[j]) == 1) { coprime_pairs++; } total_pairs++; } } if (coprime_pairs == 0) { cout << "No estimate for this data set." << endl; } else { double pi = sqrt(6.0 * total_pairs / coprime_pairs); cout << fixed << setprecision(6) << pi << endl; } } return 0; }
- 1
信息
- ID
- 492
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 1
- 上传者