可信源码风险提示:保存或下载前请阅读源码和权限声明。
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();