次方计算器

数字填多会卡

适配设备:Pro

作者:r7a89600

下载量:10 · 点赞:1

可信源码风险提示:保存或下载前请阅读源码和权限声明。
SHA-256b67eb0632248b11ad80b597bccaeb3a8a9fc1b624ac0f8c31525894a8994e51f
async function main() {
  const base = await dialog.number({ title: '底数', value: 2, min: 0, max: 1000000, decimals: 0, required: true });
  if (base.action !== 'confirm') return;
  const exponent = await dialog.number({ title: '指数', value: 10, min: 0, max: 100000, decimals: 0, required: true });
  if (exponent.action !== 'confirm') return;

  const result = ui.signal({ text: '0', done: false, step: 0, total: exponent.value, digits: 1 });

  function multiplyByBase(current, base) {
    let carry = 0;
    const arr = current.split('').reverse();
    for (let i = 0; i < arr.length; i++) {
      const product = parseInt(arr[i]) * base + carry;
      arr[i] = (product % 10).toString();
      carry = Math.floor(product / 10);
    }
    while (carry > 0) {
      arr.push((carry % 10).toString());
      carry = Math.floor(carry / 10);
    }
    return arr.reverse().join('');
  }

  // 分页显示结果
  const pageSize = 150; // 每页150位
  const page = ui.signal(0);

  function buildResultUI() {
    const r = result.get();
    const p = page.get();
    const totalPages = Math.max(1, Math.ceil(r.text.length / pageSize));
    const start = p * pageSize;
    const end = Math.min(start + pageSize, r.text.length);
    const visible = r.text.substring(start, end);

    const nodes = [
      ui.heading('大数计算器', { size: 24, lines: 1 }),
      ui.text(`底数: ${base.value}  指数: ${exponent.value}`, { size: 16, lines: 1 }),
      ui.text(r.done ? `结果 (共 ${r.digits} 位):` : `计算中... (${r.step}/${r.total}) 当前位数: ${r.digits}`, { size: 16, lines: 1 }),
      ui.text(visible, { size: 16, lines: 12, lineHeight: 20 }),
      ui.spacer(4),
    ];

    if (r.done && totalPages > 1) {
      nodes.push(
        ui.text(`第 ${p + 1}/${totalPages} 页`, { size: 16, align: 'center', lines: 1 }),
        ui.spacer(4),
        ui.buttonRow([
          { text: '上一页', onPress: () => { if (p > 0) { page.set(p - 1); ui.refresh(); } }, tone: 'neutral', disabled: p === 0 },
          { text: '下一页', onPress: () => { if (p < totalPages - 1) { page.set(p + 1); ui.refresh(); } }, tone: 'neutral', disabled: p >= totalPages - 1 },
        ])
      );
    }

    return ui.column(nodes, { gap: 6 });
  }

  ui.render(buildResultUI);

  if (exponent.value === 0) {
    result.update({ text: '1', done: true, step: 0, total: 0, digits: 1 });
    ui.refresh();
    return;
  }

  let current = '1';
  const baseStr = base.value.toString();
  const totalSteps = exponent.value;

  for (let i = 1; i <= totalSteps; i++) {
    current = multiplyByBase(current, baseStr);
    if (i % 50 === 0 || i === totalSteps) {
      result.update({ text: current, done: i === totalSteps, step: i, total: totalSteps, digits: current.length });
      ui.refresh();
      await new Promise(resolve => setTimeout(resolve, 0));
    }
  }
}
return main();