应用实例八:约分和通分工具

知识点:掌握约分和通分的方法。
功能:输入一个分数,工具可以一步步展示其约分过程(找出公因数,分子分母同时除以公因数)。输入两个分数,工具可以展示通分过程(找最小公倍数,化为同分母分数)。
在这里插入图片描述

// SimplifyCommonDenominator.ets
@Entry
@Component
struct SimplifyCommonDenominator {
  @State numerator: number = 8;
  @State denominator: number = 12;
  @State fraction2Num: number = 3;
  @State fraction2Den: number = 4;
  @State mode: 'simplify' | 'common' = 'simplify';
  @State steps: string[] = [];

  build() {
    Column({ space: 20 }) {
      Text('约分与通分工具')
        .fontSize(26)

      Row({ space: 15 }) {
        Button('约分模式').onClick(() => { this.mode = 'simplify'; this.steps = []; })
        Button('通分模式').onClick(() => { this.mode = 'common'; this.steps = []; })
      }

      if (this.mode === 'simplify') {
        // 约分界面
        Row({ space: 10 }) {
          Text('分数:')
          TextInput({ text: this.numerator.toString() }).width(100).onChange(v => this.numerator = parseInt(v) || 0)
          Text('/')
          TextInput({ text: this.denominator.toString() }).width(100).onChange(v => this.denominator = parseInt(v) || 0)
        }
        Button('开始约分').onClick(() => this.simplify())
      } else {
        // 通分界面
        Row({ space: 10 }) {
          TextInput({ text: this.numerator.toString() }).width(30).onChange(v => this.numerator = parseInt(v) || 0)
          Text('/')
          TextInput({ text: this.denominator.toString() }).width(30).onChange(v => this.denominator = parseInt(v) || 0)
          Text('和')
          TextInput({ text: this.fraction2Num.toString() }).width(30).onChange(v => this.fraction2Num = parseInt(v) || 0)
          Text('/')
          TextInput({ text: this.fraction2Den.toString() }).width(30).onChange(v => this.fraction2Den = parseInt(v) || 0)
        }
        Button('开始通分').onClick(() => this.findCommonDenominator())
      }

      // 步骤展示
      List({ space: 8 }) {
        ForEach(this.steps, (step: string) => {
          ListItem() {
            Text(step).fontSize(16)
          }
        })
      }
      .height(200)
      .width('90%')
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Start)
    .padding(20)
  }

  private simplify() {
    this.steps = [];
    // 寻找最大公因数
    let gcd = this.gcd(this.numerator, this.denominator);
    this.steps.push(`最大公因数是 ${gcd}`);
    this.steps.push(`分子分母同时除以 ${gcd}:`);
    this.steps.push(`${this.numerator} ÷ ${gcd} = ${this.numerator / gcd}`);
    this.steps.push(`${this.denominator} ÷ ${gcd} = ${this.denominator / gcd}`);
    this.steps.push(`结果: ${this.numerator / gcd}/${this.denominator / gcd}`);
  }

  private findCommonDenominator() {
    this.steps = [];
    // 找最小公倍数
    let lcm = this.lcm(this.denominator, this.fraction2Den);
    this.steps.push(`最小公倍数是 ${lcm}`);
    this.steps.push(`第一个分数变化:`);
    this.steps.push(`${this.numerator}/${this.denominator} = ${this.numerator * (lcm / this.denominator)}/${lcm}`);
    this.steps.push(`第二个分数变化:`);
    this.steps.push(`${this.fraction2Num}/${this.fraction2Den} = ${this.fraction2Num * (lcm / this.fraction2Den)}/${lcm}`);
  }

  // 计算最大公因数
  private gcd(a: number, b: number): number {
    return b === 0 ? a : this.gcd(b, a % b);
  }

  // 计算最小公倍数
  private lcm(a: number, b: number): number {
    return a * b / this.gcd(a, b);
  }
}
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐