Objective c Obj-C中大数组合的生成

Objective c Obj-C中大数组合的生成,objective-c,combinatorics,Objective C,Combinatorics,tl;dr:我应该如何处理像20!*20!在Objective-C中 我正在通过努力学习Objective-C。这很有趣,但我遇到的一个问题是处理任意大的数字。我对这些东西还是很熟悉,所以我不知道为什么像Python这样的东西比Obj-C更容易处理大量数据 以问题15为例: 从2 x 2网格的左上角开始,到右下角有6条路由(无回溯) 通过20 x 20网格有多少条路线? 那很容易。使用组合数学: (20+20)!/20!(20!) ->81591528324789734345611269596

tl;dr:我应该如何处理像
20!*20!在Objective-C中


我正在通过努力学习Objective-C。这很有趣,但我遇到的一个问题是处理任意大的数字。我对这些东西还是很熟悉,所以我不知道为什么像Python这样的东西比Obj-C更容易处理大量数据

以问题15为例

从2 x 2网格的左上角开始,到右下角有6条路由(无回溯)

通过20 x 20网格有多少条路线?

那很容易。使用组合数学:

(20+20)!/20!(20!)
->8159152832478973434561126959615894272000000/5919012181389927685417441689600000000
->137846528820

在Python中:

导入数学
打印数学阶乘(40)/(数学阶乘(20)*数学阶乘(20))
但是在Objective-C中?我还没有找到一种方法来强迫这么多人通过。使用2x2示例可以很好地工作。我可以得到应该的
9C4=126
。但是我应该如何处理像
20这样的数字呢

我一直在尝试使用
NSDecimalNumber
,它似乎支持每个数字包含更多的数字,假设您可以将其转换为
尾数x指数
,并且不介意精度损失,但这并没有太大用处,因为我不知道如何让Obj-C从
%llu
创建尾数,所以我不介意精度的损失

到目前为止,我使用的代码正确地生成了阶乘,因为它似乎
unsigned long long
处理了如此大的值,但是阻塞了
x*y
,因此
getcombineicof:20和:20
返回
1

#导入“Problem15.h”
@执行问题15
-(无符号长)阶乘:(NSNumber*)数{
无符号长临时=1;
对于(inti=[number intValue];i>0;i--){
温度*=i;
}
返回温度;
}
-(无符号long long)getcof:(NSNumber*)x和:(NSNumber*)y{
NSNumber*n=@([x intValue]+[y intValue]);
NSNumber*n_阶乘=@([自阶乘:n]);
NSNumber*x_阶乘=@([自阶乘:x]);
NSNumber*y_阶乘=@([自阶乘:y]);
返回([n_阶乘unsignedLongValue]/([x_阶乘unsignedLongValue]*[y_阶乘unsignedLongValue]);
}
-(NSString*)答案{
NSNumber*x=@5;
NSNumber*y=@4;
无符号长答案=[self-getcombinationif:x和:y];
返回[NSString stringWithFormat:@“\n\n问题15:\n通过20 x 20网格的路由有多少?\n%llu”,回答];
}
@结束

它不是Objective-C,但您可以像普通C库一样使用它


GMP也有Objective-C包装,例如。

这在最小的设置下工作得非常好;谢谢我确实担心包装器已经两年没有更新了(必须手动编辑以获得ARC支持),而且调用非常奇怪(例如,将两个
GMPInt
s相乘是:
[myGMPInt multiplyWithGMP:myOtherGMPInt];
。这本身并不是wierd,但它返回一个
void
,并且我无法将它分配给一个新的
GMPInt
,这让我有点不知所措。更深层次的问题仍然存在(如果你有答案的话):为什么Obj-C/C不像Python那样支持任意大的数字?有什么区别吗?我认为ObjC GMP包装项目看起来没有太多更新。我主要链接到它,以便您可以查看他是如何进行包装和GMP C调用的。我认为Objective-C缺少大数字类的原因是因为它是一个小类语言是标准的ANSI C的一个小扩展,它的概念与Python、java或C++不同。我认为这也被用于库。例如,看看数据结构核心基础的数据量远远少于数组、字典/散列和集合。