//
// 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
网友评论