// tools/cuo_wei_xiang_jian.dart import 'package:flutter/material.dart'; import 'package:rational/rational.dart'; import '../utils/math_utils.dart'; class CuoWeiXiangJianPage extends StatefulWidget { @override _CuoWeiXiangJianPageState createState() => _CuoWeiXiangJianPageState(); } class _CuoWeiXiangJianPageState extends State { final TextEditingController aController = TextEditingController(); final TextEditingController bController = TextEditingController(); final TextEditingController qController = TextEditingController(); final TextEditingController mController = TextEditingController(); String result = ''; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('错位相减法')), body: Padding( padding: EdgeInsets.all(16), child: Column( children: [ Text( '通项为: aₙ = (a·n + b) · qⁿ⁺ᵐ', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), SizedBox(height: 20), _buildInputField('a (系数)', aController), _buildInputField('b (常数)', bController), _buildInputField('q (公比)', qController), _buildInputField('m (指数偏移)', mController), SizedBox(height: 20), ElevatedButton( onPressed: _calculate, child: Text('计算'), ), SizedBox(height: 20), if (result.isNotEmpty) Card( child: Padding( padding: EdgeInsets.all(16), child: Text( result, style: TextStyle(fontSize: 16), ), ), ), ], ), ), ); } Widget _buildInputField(String label, TextEditingController controller) { return Padding( padding: EdgeInsets.symmetric(vertical: 8), child: TextField( controller: controller, keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true), decoration: InputDecoration( labelText: label, border: OutlineInputBorder(), hintText: '输入分数如: 1/2 或小数', ), ), ); } void _calculate() { try { final a = MathUtils.parseRational(aController.text); final b = MathUtils.parseRational(bController.text); final q = MathUtils.parseRational(qController.text); final m = int.parse(mController.text); // 将指数统一为n-1 final aAdj = a * q.pow(m + 1); final bAdj = b * q.pow(m + 1); // 计算A,B final A = aAdj / (q - Rational.one); final B = (bAdj - A) / (q - Rational.one); setState(() { result = '结果: Sₙ = (A·n + B) · qⁿ - B\n' 'A = ${MathUtils.rationalToString(A)}\n' 'B = ${MathUtils.rationalToString(B)}'; }); } catch (e) { setState(() { result = '错误: $e'; }); } } @override void dispose() { aController.dispose(); bController.dispose(); qController.dispose(); mController.dispose(); super.dispose(); } }