| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // 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<CuoWeiXiangJianPage> {
- 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();
- }
- }
|