分数合法化的创建以及进行四种运算

#import <Foundation/Foundation.h>

/**

*  分数类

*/

@interface HHFraction : NSObject {

NSInteger _num;  //分子

NSInteger _den;   // 分母

}

/**

*  初始化方法

*

*  @param num 分子

*  @param den 分母

*

*  @return 返回一个初始化对象

*/

+ (instancetype)initWithFraction:(NSInteger)num andDen:(NSInteger)den;

/**

*  用字符串初始化对象

*

*  @param str 字符串

*

*  @return 返回一个创建的分数

*/

+ (instancetype)initWithString:(NSString *)str;

/**

*  用小数初始化分数

*

*  @param value 小数

*

*  @return 返回分数

*/

+ (instancetype)initWithDoubleValue:(double)value;

/**

*  加法

*

*  @param other 另一个分数

*

*  @return 返回一个分数(求和后的结果)

*/

- (HHFraction *)add:(HHFraction *)other;

/**

*  减法

*

*  @param other 另一个分数

*

*  @return 返回一个分数(求差后的结果)

*/

- (HHFraction *)sub:(HHFraction *)other;

/**

*  乘法

*

*  @param other 另一个分数

*

*  @return 返回一个分数(求积后的结果)

*/

- (HHFraction *)mul:(HHFraction *)other;

/**

*  除法

*

*  @param other 另一个分数

*

*  @return 返回一个分数(求商后的结果)

*/

- (HHFraction *)div:(HHFraction *)other;

@end

#import "HHFraction.h"

NSInteger gcd(NSInteger a , NSInteger b){

if (a < b) {

gcd(b, a);

}

return b==0?a:gcd(b, a % b);

}

@implementation HHFraction

+ (instancetype)initWithFraction:(NSInteger)num andDen:(NSInteger)den{

return [[self alloc]initWithNum:num andDen:den];

}

- (instancetype)initWithNum:(NSInteger)num andDen:(NSInteger)den{

if (den == 0) {

@throw [NSException exceptionWithName:@"分数初始化异常" reason:@"分母不为零" userInfo:nil];

}

else{

if (self = [super init]) {

_num = num;

_den =den;

}

return [[self normal] reduce];

}

}

+ (instancetype)initWithString:(NSString *)str{

NSArray *array = [str componentsSeparatedByString:@"/"];

if (array.count != 2) {

@throw [NSException exceptionWithName:@"分数初始化异常" reason:@"输入字符串有误" userInfo:nil];

}

else{

return [[self alloc] initWithNum:[[array firstObject] integerValue] andDen:[[array lastObject] integerValue]];

}

}

+ (instancetype)initWithDoubleValue:(double)value{

return [[self alloc] initWithNum:value * 10000 andDen:10000];

}

- (HHFraction *)add:(HHFraction *)other{

return  [[[[HHFraction alloc]initWithNum:_den * other->_num + _num * other->_den andDen:_den * other->_den] normal] reduce];

}

- (HHFraction *)sub:(HHFraction *)other{

return  [[[[HHFraction alloc]initWithNum:_den * other->_num - _num * other->_den andDen:_den * other->_den] normal] reduce];

}

- (HHFraction *)mul:(HHFraction *)other{

return  [[[[HHFraction alloc]initWithNum:_num * other->_num andDen:_den * other->_den] normal] reduce];

}

- (HHFraction *)div:(HHFraction *)other{

return  [[[[HHFraction alloc]initWithNum:_num * other->_den andDen:_den * other->_num] normal] reduce];

}

//分数正常化

- (HHFraction *)normal{

if (_den < 0) {

_num = -_num;

_den = -_den;

}

return self;

}

//约分

- (HHFraction *)reduce{

if (_num == 0) {

_den = 1;

}else{

NSInteger x = _num > 0?_num : -_num;

NSInteger y = _den > 0?_den : -_den;

NSInteger max = gcd(x, y);

_num /= max;

_den /= max;

}

return self;

}

- (NSString *)description{

if (_den == 1) {

return [NSString stringWithFormat:@"%ld",_num];

}

return [NSString stringWithFormat:@"%@%ld/%ld%@",_num < [email protected]"(":@"",_num,_den,_num < [email protected]")":@""];

}

@end

#import <Foundation/Foundation.h>

#import "HHFraction.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

HHFraction *f1 = [HHFraction initWithFraction:2 andDen:-9];

NSLog(@"%@",f1);

HHFraction *f2 = [HHFraction initWithFraction:2 andDen:-4];

NSLog(@"%@ + %@ = %@",f1,f2,[f1 add:f2]);

NSLog(@"%@ - %@ = %@",f1,f2,[f1 sub:f2]);

NSLog(@"%@ ?? %@ = %@",f1,f2,[f1 mul:f2]);

NSLog(@"%@ ? %@ = %@",f1,f2,[f1 div:f2]);

}

return 0;

}

时间: 2024-10-12 23:51:26

分数合法化的创建以及进行四种运算的相关文章

创建线程的四种方式

https://www.cnblogs.com/zhou-test/p/9811771.html 原文地址:https://www.cnblogs.com/linliquan/p/11350422.html

创建线程有几种不同的方式?你喜欢哪一种?为什么?

创建线程有四种不同的方式: 1.继承Thread类 2.实现Runnable接口 3.应用程序可以使用Executor框架来创建线程池 4.实现Callable接口 我更喜欢实现Runnable接口,因为这样不需要继承Thread类.在应用设计中已经继承了别的对象的情况下,这需要多继承,而Java只能单继承,所以只能实现接口.同时线程池的效率也非常高,很容易实现和使用. 原文地址:https://www.cnblogs.com/Freak-Lew/p/9193913.html

二叉树的创建和四种遍历(前序、先序、后序、层次、结点的层数、深度、叶子数等)—java描述

二叉树的创建和四种遍历(前序.先序.后序.层次.结点的层数.深度.叶子数等)—java描述 package javab; //树的结点类 public class TreeNode { String data; TreeNode leftChild,rightChild,next; public TreeNode(String data){ this.data=data; } public TreeNode(String data,TreeNode left,TreeNode right){ l

java中内部类的创建四种情况,三种方式,及内部数据访问权限

内部类和外部类的关系,及内部静态类的数据访问权限,声明方式. 第一种,在外部类内部声明使用内部类,内部类的类型为static和非 static类型,内部类数据类型为private,protected,public 类型的访问权限.外部类为非静态声明和权限如下: package com; public class Test1 { //@author 张春蕾 private class Name{ private int i =1; public int s = 2; protected int m

数组的创建/查找数组里面的内容/添加数组中元素/使用指定的字符串把数组链接起来/判断数组内是否有指定的数组元素/四种遍历进行输出数组中的元素有哪些

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //创建数组 //1.快速创建数组@[] NSArray*[email protected][@"month",@"tue",@" wed",@"fir"]; //2,创建空的数组 NSArray*arr=[[NSArray a

Java线程池的四种创建方式

Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保

Aspose.Words for .NET图表教程——创建四种OOXML图表

Aspose.Words For .Net是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word.此外,API支持所有流行的Word处理文件格式,并允许将Word文档导出或转换为固定布局文件格式和最常用的图像/多媒体格式. 接下来我们进入关于“使用图表”的介绍,在Aspose.Words中学会从头开始创建OOXML图表,包括柱状图.散点图.面积图和气泡图. (如果您想下载Aspos

angular创建自定义指令的四种方式

angular除了内置的部分指令,还可以通过.directive来自定义指令.要调用自定义指令,HTML 元素上需要添加自定义指令名.使用驼峰法来命名一个指令:nsHeader,在调用时使用需要-来分割:ns-header.自定义指令调用的的方式有四种,如下: 元素名 属性 类名 注释 1.使用元素名调用: 1 <!DOCTYPE html> 2 <html ng-app="myApp"> 3 <head> 4 <meta charset=&q

数组的四种创建方法

第一种: string[] myArray = new string[10]; for(int i = 0; i<10;i++){ myArray[i] = i+1; } 第二种: string[] myArray2 = {"1","2","3","4","5","6","7","8","9","10"