You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:16:20