1 条题解

  • 0
    @ 2025-4-8 16:12:33

    题意分析

    题目要求基于数论中的一个经典结论:
    从随机整数集合中任取两数,其互质的概率为 6/π26/\pi^2
    给定若干数据集(每组包含NN个正整数),需完成:
    1、计算每组中所有可能的数对(组合C(N,2)C(N,2)个)
    2、统计其中互质数对的数量
    3、根据概率公式反推π\pi的估计值:
    $\pi \approx \sqrt{6/\text{互质概率}} = \sqrt{6 \times \text{总对数}/\text{互质对数}}$
    4、若没有互质数对,输出特定提示。

    解题思路

    1、关键公式:
    互质概率 P=互质对数/总对数=6/π2P = \text{互质对数}/\text{总对数} = 6/\pi^2
    推导得 $\pi = \sqrt{6/P} = \sqrt{6 \times \text{总对数}/\text{互质对数}}$
    2、核心操作:
    遍历所有数对 (ai,aj)(a_i, a_j)i<ji < j),用欧几里得算法计算GCDGCD
    统计GCDGCD11的数对数量
    3、边界处理:
    若互质对数为00,无法计算π\pi,输出提示信息

    实现步骤

    1、输入处理:
    循环读取每个数据集的NN值,直到N=0N=0终止
    对每个数据集,读取NN个正整数存入数组
    2、数对遍历:
    双重循环枚举所有C(N,2)C(N,2)个数对
    3、GCDGCD计算:
    对每个数对(ai,aj)(a_i, a_j),计算其最大公约数
    4、统计与计算:
    GCDGCD11,互质计数器加11
    最终用公式计算π\pi值,保留66位小数
    5、输出结果:
    根据互质对数是否为零选择输出π\pi或提示信息

    #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
    上传者