cuo_wei_xiang_jian.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // tools/cuo_wei_xiang_jian.dart
  2. import 'package:flutter/material.dart';
  3. import 'package:rational/rational.dart';
  4. import '../utils/math_utils.dart';
  5. class CuoWeiXiangJianPage extends StatefulWidget {
  6. @override
  7. _CuoWeiXiangJianPageState createState() => _CuoWeiXiangJianPageState();
  8. }
  9. class _CuoWeiXiangJianPageState extends State<CuoWeiXiangJianPage> {
  10. final TextEditingController aController = TextEditingController();
  11. final TextEditingController bController = TextEditingController();
  12. final TextEditingController qController = TextEditingController();
  13. final TextEditingController mController = TextEditingController();
  14. String result = '';
  15. @override
  16. Widget build(BuildContext context) {
  17. return Scaffold(
  18. appBar: AppBar(title: Text('错位相减法')),
  19. body: Padding(
  20. padding: EdgeInsets.all(16),
  21. child: Column(
  22. children: [
  23. Text(
  24. '通项为: aₙ = (a·n + b) · qⁿ⁺ᵐ',
  25. style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
  26. ),
  27. SizedBox(height: 20),
  28. _buildInputField('a (系数)', aController),
  29. _buildInputField('b (常数)', bController),
  30. _buildInputField('q (公比)', qController),
  31. _buildInputField('m (指数偏移)', mController),
  32. SizedBox(height: 20),
  33. ElevatedButton(
  34. onPressed: _calculate,
  35. child: Text('计算'),
  36. ),
  37. SizedBox(height: 20),
  38. if (result.isNotEmpty)
  39. Card(
  40. child: Padding(
  41. padding: EdgeInsets.all(16),
  42. child: Text(
  43. result,
  44. style: TextStyle(fontSize: 16),
  45. ),
  46. ),
  47. ),
  48. ],
  49. ),
  50. ),
  51. );
  52. }
  53. Widget _buildInputField(String label, TextEditingController controller) {
  54. return Padding(
  55. padding: EdgeInsets.symmetric(vertical: 8),
  56. child: TextField(
  57. controller: controller,
  58. keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true),
  59. decoration: InputDecoration(
  60. labelText: label,
  61. border: OutlineInputBorder(),
  62. hintText: '输入分数如: 1/2 或小数',
  63. ),
  64. ),
  65. );
  66. }
  67. void _calculate() {
  68. try {
  69. final a = MathUtils.parseRational(aController.text);
  70. final b = MathUtils.parseRational(bController.text);
  71. final q = MathUtils.parseRational(qController.text);
  72. final m = int.parse(mController.text);
  73. // 将指数统一为n-1
  74. final aAdj = a * q.pow(m + 1);
  75. final bAdj = b * q.pow(m + 1);
  76. // 计算A,B
  77. final A = aAdj / (q - Rational.one);
  78. final B = (bAdj - A) / (q - Rational.one);
  79. setState(() {
  80. result = '结果: Sₙ = (A·n + B) · qⁿ - B\n'
  81. 'A = ${MathUtils.rationalToString(A)}\n'
  82. 'B = ${MathUtils.rationalToString(B)}';
  83. });
  84. } catch (e) {
  85. setState(() {
  86. result = '错误: $e';
  87. });
  88. }
  89. }
  90. @override
  91. void dispose() {
  92. aController.dispose();
  93. bController.dispose();
  94. qController.dispose();
  95. mController.dispose();
  96. super.dispose();
  97. }
  98. }