从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的字符串,后续逻辑全部出错。
修复方案
- 重置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; } } }
- 额外优化建议:
- 增加存在性检查:在拼接
sequence时,先判断pi[j]是否存在,避免拼接undefined:if (pi[j]) sequence += pi[j]; - 修正质数判断逻辑:当前用
sequence % x === 0判断质数的方法完全错误——21位数字远超JavaScript安全整数范围,取余运算会失真,且判断质数需要检查到该数的平方根,而非仅到10。
- 增加存在性检查:在拼接
内容的提问来源于stack exchange,提问作者Kelson Batista
相关产品推荐
相关产品推荐

