Arithmetic/Rational/Objective-C: Difference between revisions

no edit summary
No edit summary
 
(2 intermediate revisions by 2 users not shown)
Line 1:
{{collection|Rational Arithmetic}}
 
File <tt>frac.h</tt>
<syntaxhighlight lang="objective-c">
 
<lang objc>#import <Foundation/Foundation.h>
 
@interface RCRationalNumber : NSObject
Line 13 ⟶ 12:
BOOL withSign;
}
+(RCRationalNumber *instancetype)valueWithNumerator:(int)num andDenominator: (int)den;
+(RCRationalNumber *instancetype)valueWithDouble: (double)fnum;
+(RCRationalNumber *instancetype)valueWithInteger: (int)inum;
+(RCRationalNumber *instancetype)valueWithRational: (RCRationalNumber *)rnum;
-(instancetype)initWithNumerator: (int)num andDenominator: (int)den;
-(id)init;
-(idinstancetype)initWithNumeratorinitWithDouble: (intdouble)numfnum andDenominatorprecision: (int)denprec;
-(idinstancetype)initWithInteger: (int)inum;
-(id)initWithDouble: (double)fnum precision: (int)prec;
-(idinstancetype)initWithRational: (RCRationalNumber *)rnum;
-(id)initWithInteger: (int)inum;
-(id)initWithRational: (RCRationalNumber *)rnum;
-(NSComparisonResult)compare: (RCRationalNumber *)rnum;
-(id)simplify: (BOOL)act;
Line 49 ⟶ 47:
-(double)number;
-(int)integer;
@end</langsyntaxhighlight>
;File <tt>frac.m</tt>
 
<syntaxhighlight lang="objective-c">
File <tt>frac.m</tt>
<lang objc>#import <Foundation/Foundation.h>
 
<lang objc>#import <Foundation/Foundation.h>
#import <math.h>
#import "frac.h"
Line 67 ⟶ 65:
@implementation RCRationalNumber
// initializers
-(idinstancetype)init
{
NSLog(@"initialized to unity");
Line 73 ⟶ 71:
}
 
-(idinstancetype)initWithNumerator: (int)num andDenominator: (int)den
{
if ((self = [super init]) != nil) {
Line 89 ⟶ 87:
}
 
-(idinstancetype)initWithInteger:(int)inum
{
return [self initWithNumerator: inum andDenominator: 1];
}
 
-(idinstancetype)initWithDouble: (double)fnum precision: (int)prec
{
if ( prec > 9 ) prec = 9;
Line 102 ⟶ 100:
}
 
-(idinstancetype)initWithRational: (RCRationalNumber *)rnum
{
return [self initWithNumerator: [rnum numerator] andDenominator: [rnum denominator]];
Line 215 ⟶ 213:
}
 
// or just test if negativnegative
-(BOOL)isNegative
{
return ([self numerator] < 0) ? YES : NO;
}
 
Line 257 ⟶ 255:
 
// class method
+(RCRationalNumber *instancetype)valueWithNumerator:(int)num andDenominator: (int)den
{
return [[[RCRationalNumberself alloc] initWithNumerator: num andDenominator: den] autorelease];
}
 
+(RCRationalNumber *instancetype)valueWithDouble: (double)fnum
{
return [[[RCRationalNumberself alloc] initWithDouble: fnum] autorelease];
}
 
+(RCRationalNumber *instancetype)valueWithInteger: (int)inum
{
return [[[RCRationalNumberself alloc] initWithInteger: inum] autorelease];
}
 
+(RCRationalNumber *instancetype)valueWithRational: (RCRationalNumber *)rnum
{
return [[[RCRationalNumberself alloc] initWithRational: rnum] autorelease];
}
@end</langsyntaxhighlight>
 
;Testing it.
<syntaxhighlight lang="objective-c">
 
<lang objc>#import <Foundation/Foundation.h>
#import "frac.h"
#import <math.h>
Line 286 ⟶ 284:
int main()
{
@autoreleasepool {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
int i;
for(i=2; i < 0x80000; i++) {
int candidate = i;
RCRationalNumber *sum = [RCRationalNumber valueWithNumerator: 1
andDenominator: candidate];
int factor;
for(factor=2; factor < sqrt((double)candidate); factor++) {
if ( (candidate % factor) == 0 ) {
sum = [[sum add: [RCRationalNumber valueWithNumerator: 1
andDenominator: factor]]
add: [RCRationalNumber valueWithNumerator: 1
andDenominator: (candidate/factor)]];
}
}
if ( [sum denominator] == 1 ) {
printf("Sum of recipr. factors of %d = %d exactly %s\n",
candidate, [sum integer], ([sum integer]==1) ? "perfect!" : "");
}
}
 
if ( [sum denominator] == 1 ) {
printf("Sum of recipr. factors of %d = %d exactly %s\n",
candidate, [sum integer], ([sum integer]==1) ? "perfect!" : "");
}
}
 
[pool release];
return 0;
}</langsyntaxhighlight>