美文网首页
分数的加减乘除运算

分数的加减乘除运算

作者: 小曼blog | 来源:发表于2020-02-17 16:53 被阅读0次
//
//  Fraction.h
//  Fraction
//
//  Created by wenhuanhuan on 2020/2/17.
//  Copyright © 2020 weiman. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
 这是一个分数类,计算分数的加减乘数
 */
@interface Fraction : NSObject
{
    int sgn; //表示符号位,1为正数,2为负数
    int fenzi;//分子
    int fenmu;//分母
}

+(id)fractionWithfenzi: (int)n fenmu: (int)m;
-(id)initWithfenzi:(int)n fenmu: (int)m;

-(Fraction *)add: (Fraction *)obj;
-(Fraction *)sub: (Fraction *)obj;
-(Fraction *)mul: (Fraction *)obj;
-(Fraction *)div: (Fraction *)obj;

-(NSString *)desc;

@end

NS_ASSUME_NONNULL_END

实现

//
//  Fraction.m
//  Fraction
//
//  Created by wenhuanhuan on 2020/2/17.
//  Copyright © 2020 weiman. All rights reserved.
//

#import "Fraction.h"

@implementation Fraction

#define SIGN(a) (((a) >= 0) ? 1 : (-1))

//计算两个整数的最大公约数,辗转相除法,递归
static int gcd(int a, int b) {
    if (a < b)  return gcd(b, a);
    if (b == 0) return a;
    return gcd(b, a % b);
}

//用于约分的私有方法
- (void)reduce {
    int d;
    if (fenzi == 0) {
        fenmu = 1;
        sgn = 1;
        return;
    }
    
    if (fenmu == 0) {
        fenzi = 1;
        NSLog(@"分母不能为0");
        return;
    }
    
    if ((d = gcd(fenzi, fenmu)) == 1) {
        return;
    }
    
    fenzi = fenzi / d;
    fenmu = fenmu / d;
}

+ (id)fractionWithfenzi:(int)n fenmu:(int)m {
    id f = [[self alloc] initWithfenzi:n fenmu:m];
    return f;
}

-(id)initWithfenzi:(int)n fenmu:(int)m {
    self = [super init];
    if (self != nil) {
        sgn = SIGN(n) * SIGN(m);
        fenzi = abs(n); //C语言 abs() 函数用于求整数的绝对值。
        fenmu = abs(m);
        [self reduce];
    }
    return self;
}

- (Fraction *)add:(Fraction *)obj {
    int n, d;
    
    if (fenmu == obj->fenmu) {
        //分母相同,分子相加
        n = sgn * fenzi + obj->sgn * obj->fenzi;
        d = fenmu;
    } else {
        //分母不同,先通分,再分子相加,最后约分
        int t = sgn * fenzi * obj->fenmu;
        int v = obj->sgn * obj->fenzi * fenmu;
        n = t + v;
        d = fenmu * obj->fenmu;
    }
    return [Fraction fractionWithfenzi:n fenmu:d];
}

- (Fraction *)sub:(Fraction *)obj {
    Fraction * tmp;
    int n = -1 * obj->sgn * obj->fenzi;
    tmp = [Fraction fractionWithfenzi:n fenmu:obj->fenmu];
    return [self add:tmp];
}

- (Fraction *)mul:(Fraction *)obj {
    int n = sgn * obj->sgn * fenzi * obj->fenzi;
    int d = fenmu * obj->fenmu;
    return [Fraction fractionWithfenzi:n fenmu:d];
}

- (Fraction *)div:(Fraction *)obj {
    int n = sgn * obj->sgn * fenzi * obj->fenmu;
    int d = fenmu * obj->fenzi;
    return [Fraction fractionWithfenzi:n fenmu:d];
}

- (NSString *)desc {
    int n = (sgn >= 0) ? fenzi : -fenzi;
    return (fenmu == 1)
    ? [NSString stringWithFormat:@"%d",n]
    : [NSString stringWithFormat:@"%d/%d", n, fenmu];
}

@end

验证

//
//  main.m
//  Fraction
//
//  Created by wenhuanhuan on 2020/2/17.
//  Copyright © 2020 weiman. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Fraction.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        
        Fraction * f1 = [Fraction fractionWithfenzi:2 fenmu:3];
        Fraction * f2 = [Fraction fractionWithfenzi:3 fenmu:7];
        Fraction * r1 = [f1 add:f2];
        Fraction * r2 = [f1 sub:f2];
        Fraction * r3 = [f1 mul:f2];
        Fraction * r4 = [f1 div:f2];
        
        NSLog(@"r1 = %@",[r1 desc]);
        NSLog(@"r2 = %@",[r2 desc]);
        NSLog(@"r3 = %@",[r3 desc]);
        NSLog(@"r4 = %@",[r4 desc]);
    }
    return 0;
}

结果:

2020-02-17 16:42:57.145417+0800 Fraction[2079:74602] Hello, World!
2020-02-17 16:42:57.146011+0800 Fraction[2079:74602] r1 = 23/21
2020-02-17 16:42:57.146086+0800 Fraction[2079:74602] r2 = 5/21
2020-02-17 16:42:57.146150+0800 Fraction[2079:74602] r3 = 2/7
2020-02-17 16:42:57.146303+0800 Fraction[2079:74602] r4 = 14/9
Program ended with exit code: 0

相关文章

  • 《分数除法一》教学反思

    分数除法是分数加减乘除中的最后一种运算,分数除法一主要学习内容是分数除以整数,运算法则是:除以一个不为零的整...

  • 分数的加减乘除运算

    实现 验证 结果:

  • 基于golang的分数运算函数

    gofal gofal golang分数运算相关函数 支持精准运算 支持加减乘除 支持链式表达式 支持结果输出(f...

  • 7.12,雨。

    英语:4000词一单元。 语文:背诵《论语》一篇。 数学:分数、小数、百分数加减乘除混合运算。 阅读:读完小说《奇...

  • 分数的加减

    我们学了这么久了,分数该学分数的加减乘除了,那么加减乘除。好像只在整数小数里听过分数也能加减乘除吗? 当然可以,那...

  • swift教程(2)

    swift的运算 加减乘除 三目运算符 与或关系 运算比较

  • 浮点数运算 (加减乘除)

    【浮点数运算加减乘除】

  • 不用加减乘除运算符,求整数的7倍

    问题 不用加减乘除运算符,求整数的7倍 思路 当需要进行避免使用加减乘除的数学运算的时候,通常的方法有:位运算、E...

  • 位运算可以做什么

    加密,运算效率,判断跳转,加减乘除

  • 8.5张量运算

    基本数学运算加减乘除运算image-20201212204508955幂指对数运算image-2020121220...

网友评论

      本文标题:分数的加减乘除运算

      本文链接:https://www.haomeiwen.com/subject/erxifhtx.html