不使用pow函数高效计算1/a²+…+1/a²ⁿ序列和的实现方法
实现思路
你要计算的序列是首项为1/a²、公比为1/a²的n项等比数列,完全不需要调用pow幂函数:迭代过程中只需要维护当前项的值,每轮循环给当前项乘一次公比(等价于除以a²),再累加到总和里即可。这个逻辑比你现有Pascal实现更简洁,同时可以完整保留输入校验、浮点下溢判断的能力。
提前算好公比之后用乘法更新当前项,比每轮做两次除法的运算效率更高。虽然等比数列有直接求和公式,但公式法需要计算a的2n次幂,反而不如迭代法实现方便。
各语言实现代码
C语言实现
#include <stdio.h> #include <float.h> int main() { int n, i; double a, sum = 0.0, cur, ratio; // 校验n输入合法性 do { printf("n = "); scanf("%d", &n); if (n < 1) printf("Error: n <= 0, reenter.\n"); } while (n < 1); // 校验a输入合法性,避免除0 do { printf("a = "); scanf("%lf", &a); if (a == 0) printf("Error: a = 0, reenter.\n"); } while (a == 0); ratio = 1.0 / (a * a); cur = ratio; // 首项为1/a² for (i = 0; i < n; i++) { // 当前项小于双精度最小正浮点数时,判定为下溢 if (cur < DBL_MIN) { printf("Float rounding error.\n"); return 0; } sum += cur; cur *= ratio; // 乘公比得到下一项 } printf("s = %lf\n", sum); return 0; }
C++实现
#include <iostream> #include <limits> using namespace std; int main() { int n, i; double a, sum = 0.0, cur, ratio; do { cout << "n = "; cin >> n; if (n < 1) cout << "Error: n <= 0, reenter." << endl; } while (n < 1); do { cout << "a = "; cin >> a; if (a == 0) cout << "Error: a = 0, reenter." << endl; } while (a == 0); ratio = 1.0 / (a * a); cur = ratio; for (i = 0; i < n; i++) { if (cur < numeric_limits<double>::min()) { cout << "Float rounding error." << endl; return 0; } sum += cur; cur *= ratio; } cout << "s = " << sum << endl; return 0; }
Java实现
import java.util.Scanner; public class GeometricSeriesSum { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n, i; double a, sum = 0.0, cur, ratio; do { System.out.print("n = "); n = sc.nextInt(); if (n < 1) System.out.println("Error: n <= 0, reenter."); } while (n < 1); do { System.out.print("a = "); a = sc.nextDouble(); if (a == 0) System.out.println("Error: a = 0, reenter."); } while (a == 0); ratio = 1.0 / (a * a); cur = ratio; for (i = 0; i < n; i++) { if (cur < Double.MIN_VALUE) { System.out.println("Float rounding error."); sc.close(); return; } sum += cur; cur *= ratio; } System.out.println("s = " + sum); sc.close(); } }
简化版Pascal实现
program sum; var i, n: integer; s, a, cur, ratio: real; begin repeat write('n = '); readln(n); if n < 1 then writeln('Error: n <= 0, reenter.') until n >= 1; repeat write('a = '); readln(a); if a = 0 then writeln('Error: a = 0, reenter.') until a <> 0; s := 0; ratio := 1 / (a * a); cur := ratio; for i := 1 to n do begin if cur = 0 then begin writeln('Float rounding error.'); readln; exit; end; s := s + cur; cur := cur * ratio; end; writeln('s = ', s); readln; end.
实现说明
- 所有代码均严格遵守不使用pow幂函数的强制要求,仅通过基础乘除运算完成计算
- 保留了原实现的所有校验逻辑,不会出现除以0、浮点下溢导致结果无意义的问题
- 迭代逻辑比原Pascal代码更简洁,去掉了多余的状态标记变量,代码可读性更高
内容的提问来源于stack exchange,提问作者Artostapyshyn
相关产品推荐
相关产品推荐

