接近于pi的程序 在一个平静的午后两个神秘的数字悄然相遇了。它们分别是-1031158223和-328227871。这两个数字看起来普普通通但谁知它们背后隐藏着一段令人惊叹的奇幻之旅。这两个数字其实是π的两位探险家它们决定通过一次除法运算来探索π的奥秘。它们知道这次探险的结果将是一个新的有理数而这个有理数将无限接近那个神秘而迷人的π。停停停哪有这么写文章的离了大谱。——————————————不怎么华丽的分割线————————————————————终于结果出现了它是一个令人震撼的有理数3.1415925157678033。这个数字虽然与π还有微小的差距但它已经足够接近π了足以让这两个探险家心满意足。这次奇幻之旅结束了但两个数字之间的友谊却永远不会结束。它们知道在未来的日子里它们还会继续探索π的奥秘寻找更多与π有关的有理数。又来了不是这样的……是这样子的我本来想要找一个接近于pi的分数想着想着就写起了程序……虾扯。虽然说-1031158223和-328227871一除是3.1415925157678033所以……所以什么来着……#include iostream #include cmath #include limits int continuedFractionTerm(int n) { if (n 0) return 1; if (n % 2 0) { return 2 * n 1; } else { return 2 * n; } } std::pairint, int bestRationalApproximation(double target, int maxDenominator) { int numerator 0; int denominator 1; int prevNumerator 1; int prevDenominator 0; double bestDiff std::numeric_limitsdouble::max(); for (int i 0; i maxDenominator; i) { int term continuedFractionTerm(i); int newNumerator prevDenominator term * prevNumerator; int newDenominator prevNumerator; prevNumerator newNumerator; prevDenominator newDenominator; double currentPi static_castdouble(newNumerator) / newDenominator; double diff std::abs(currentPi - target); if (diff bestDiff) { bestDiff diff; numerator newNumerator; denominator newDenominator; } } return {numerator, denominator}; } int main() { const double pi_approx 3.141592653897932384; int maxDenominator 100000000; std::pairint, int approximation bestRationalApproximation(pi_approx, maxDenominator); std::cout 最接近π的分数是: approximation.first / approximation.second std::endl; std::cout 差异是: std::abs(static_castdouble(approximation.first) / approximation.second - pi_approx) std::endl; return 0; }哎好吧就这样这种方法基于连分数但是它会找到最接近给定实数的有理数。在这个情况下是π它可以用来找到最佳有理逼近。这里面我用的是3.141592653897932384和100000000想改的可以改。全曲终注int在大量迭代下会溢出上面那个负数结果很可能就是溢出产物不是真正的连分数收敛值。想复现的话把int换成long long或__int128试试。