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

从PI API取数时循环第二轮返回undefined问题排查

问题:从PI API获取圆周率数据时,第二轮循环返回undefined的原因

我通过PI Api获取圆周率数字,为提升效率,在每个105位的块(5×21位)中检查连续21位数字是否为回文数。测试时我的代码在for循环的第二轮返回undefined,请问这是什么原因?

注:105位块和2轮循环仅用于测试。

import fetch from "node-fetch";
import fs from "fs";

const contentPI = async (start, size) => {
  return await fetch(`https://api.pi.delivery/v1/pi?start=${start}&numberOfDigits=${size}`)
  .then(response => response.json())
  .then(data => data.content);
} 

let start = 1;
let size = 105;
let group = 0;

for (let y = 0; y < 2; y += 1) {
  const pi = await contentPI(start, size);

  let sequence = '';

  for (let i = 0; i < 5; i += 1) {
    let count = 0;
    for (let j = group; j < group + 21; j += 1) {
      sequence += pi[j];
    }
  
    console.log(sequence, ' - ', i, 'seq');
    for (let x = 2; x <= 10; x += 1) {
      if (sequence % x === 0) {
        count++;
      }
    }
    const result = (count > 0) ? 'not prime' : 'prime';
    if (result === 'prime') {
      const reverseSequence = sequence.split('').reverse().join('');
      if (sequence === reverseSequence) {
        console.log(`${sequence} - palindromic prime - position: ${i * 9}`);
      }
    }
    sequence = '';
    group += 21;
    count = 0;
    if (i === 4) {
      start += 105;
    }
  }
}

问题根源

group是全局变量,第一轮循环处理完5个21位片段后,group的值会累加为5*21=105。而第二轮循环获取的新PI块长度只有105位(索引范围是0到104),此时用j=105访问pi[j]会得到undefined,导致sequence拼接出包含undefined的字符串,后续逻辑全部出错。

修复方案

  1. 重置group变量:将group移到外层for循环内部,每次处理新的PI块时重置为0,确保每个105位块都从索引0开始截取片段:
import fetch from "node-fetch";
import fs from "fs";

const contentPI = async (start, size) => {
  return await fetch(`https://api.pi.delivery/v1/pi?start=${start}&numberOfDigits=${size}`)
  .then(response => response.json())
  .then(data => data.content);
} 

let start = 1;
let size = 105;

for (let y = 0; y < 2; y += 1) {
  let group = 0; // 移到此处,每次循环重置为0
  const pi = await contentPI(start, size);

  let sequence = '';

  for (let i = 0; i < 5; i += 1) {
    let count = 0;
    for (let j = group; j < group + 21; j += 1) {
      sequence += pi[j];
    }
  
    console.log(sequence, ' - ', i, 'seq');
    for (let x = 2; x <= 10; x += 1) {
      if (sequence % x === 0) {
        count++;
      }
    }
    const result = (count > 0) ? 'not prime' : 'prime';
    if (result === 'prime') {
      const reverseSequence = sequence.split('').reverse().join('');
      if (sequence === reverseSequence) {
        console.log(`${sequence} - palindromic prime - position: ${i * 9}`);
      }
    }
    sequence = '';
    group += 21;
    count = 0;
    if (i === 4) {
      start += 105;
    }
  }
}
  1. 额外优化建议:
    • 增加存在性检查:在拼接sequence时,先判断pi[j]是否存在,避免拼接undefined:if (pi[j]) sequence += pi[j];
    • 修正质数判断逻辑:当前用sequence % x === 0判断质数的方法完全错误——21位数字远超JavaScript安全整数范围,取余运算会失真,且判断质数需要检查到该数的平方根,而非仅到10。

内容的提问来源于stack exchange,提问作者Kelson Batista

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:36:50