用obj-cl来实现前面的sieve代码貌似“丑”了不少,应该有更好的方式:比如不用Foundation或不用NSArray类,而改用其它更“底层”的类。

先把代码贴出来:

//
//  main.m
//  sieve
//
//  Created by kinds on 15/5/2.
//  Copyright (c) 2015年 hopy. All rights reserved.
//

#import <Foundation/Foundation.h>
//#include <time.h>
//#include <unistd.h>

typedef unsigned long long ULL;

void zero_array(ULL count,NSMutableArray *ary){
    for (ULL i = 0; i < count; i++) {
        [ary addObject:[NSNumber numberWithInt:0]];
    }
}

ULL sieve_objc(ULL n){
    NSMutableArray *ary = [NSMutableArray arrayWithCapacity:n+1];
    zero_array(n+1, ary);
    //NSLog(@"ary is %lu",[ary count]);
    ULL max = sqrtl(n);
    ULL p = 2;
    NSNumber *x = nil;
    while (p<=max) {
        for(ULL i=2*p;i<=n;i+=p)
            //[ary replaceObjectAtIndex:i withObject:[NSNumber numberWithInt:1]];
            [ary setObject:[NSNumber numberWithInt:1] atIndexedSubscript:i];
        x = [ary objectAtIndex:++p];
        while ([x intValue]) {
            x = [ary objectAtIndex:++p];
        }
    }
    x = [ary objectAtIndex:n];
    while ([x intValue]) {
        n--;
        x = [ary objectAtIndex:n];
    }
    return n;
}

ULL sieve(ULL n){
    char *ary = malloc(n+1);
    if(!ary) return 0;
    memset(ary,0,n+1);
    ULL max = sqrtl(n);
    ULL p = 2;
    while (p <= max) {
        for(ULL i = 2*p;i<=n;i+=p)
            ary[i] = 1;
        while (ary[++p]); //empty
    }
    while(ary[n]) n--;
    return n;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSProcessInfo *psi = [NSProcessInfo processInfo];
        NSArray *args = [psi arguments];
        if([args count] != 2){
            printf("usage : %s n\n",[[[args objectAtIndex:0] lastPathComponent] UTF8String]);
            return 1;
        }

        long long n = [[args objectAtIndex:1] integerValue];
        if (!n) {
            puts("you must input a number");
            return 2;
        }
        if(n<0){
            puts("you must input a +number");
            return 3;
        }
        clock_t start = clock();
        //ULL result = sieve((ULL)n);
        ULL result = sieve_objc((ULL)n);
        if(!result){
            puts("sieve calc failed!");
            return 4;
        }
        double end = ((1.0 * (clock() - start)) / CLOCKS_PER_SEC) * 1000.0;
        printf("max p is %llu (take %f ms)\n",result,end);
    }
    return 0;
}

没找到NSArray中的类或实例方法有可以完成如下简单的数组功能:

//定义10000个指定对象的数组
typedef struct _st_foo{
    char name[256];
    char note[1024];
    int age;
    unsigned long long id;
    }st_foo,*pst_foo;

st_foo ary[1024]; //NSArray can't do this

所以写了一个zero_array函数来完成该功能,该函数超慢的。

所以可想而知这个obj-c版的效率能有多差,等有机会再优化一下吧。

sieve的objective-c实现的更多相关文章

  1. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  2. 埃拉托色尼筛法(Sieve of Eratosthenes)求素数。

    埃拉托色尼筛法(Sieve of Eratosthenes)是一种用来求所有小于N的素数的方法.从建立一个整数2~N的表着手,寻找i? 的整数,编程实现此算法,并讨论运算时间. 由于是通过删除来实现, ...

  3. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  4. Objective的字符串拼接 似乎没有Swift方便,但也可以制做一些较为方便的写法

    NSString *str1 = @"字符串1"; NSString *str2 = @"字符串2"; //在同样条件下,Objective的字符串拼接 往往只 ...

  5. [转] 从 C 到 Objective C 入门1

    转自: http://blog.liuhongwei.cn/iphone/objective-c/ 进军iPhone开发,最大的难点之一就是怪异的Objective C语法了.不过,了解之后才发现,原 ...

  6. Objective C运行时(runtime)

    #import <objc/runtime.h> void setBeingRemoved(id __self, SEL _cmd) { NSLog(@"------------ ...

  7. Objective C ARC 使用及原理

    手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档过程中的疑问和答案写下来.下面有些是翻译,但 ...

  8. Objective -C学习笔记之字典

    //字典:(关键字 值) // NSArray *array = [NSArray array];//空数组 // NSDictionary *dictionary = [NSDictionary d ...

  9. 刨根问底Objective-C Runtime

    http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and- ...

  10. Objective-C( Foundation框架 一 字符串)

    Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...

随机推荐

  1. 【并发编程】ThreadPoolExecutor参数详解

    ThreadPoolExecutor executor = new ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long ke ...

  2. Android简易实战教程--第八话《短信备份~一》

    各种手机助手里面都包含了短信备份这一项.短信的本分主要包含四项:内容body.事件date.方式type.号码address. 短信备份~一.使用一种很笨的方式来保存短信到xml文件中,而且保存在外部 ...

  3. MonoBehaviour介绍(Unity3D开发之一)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=486 猴子自学Unity已经一段 ...

  4. 详解EBS接口开发之更新供应商付款方法

    更新供应商地点层的付款方法API DECLARE --API 参数 l_external_payee_rec_type iby_disbursement_setup_pub.external_paye ...

  5. 基于androidpn客户端修改的AndroidPNClient

    最近在做推送,采用的框架是androidpn,但对于客户端实在是修改得受不了了,特别是重连和连接那一块,有些BUG的修改实在是难以下手,比如在重连那里,原来的写法是在死循环中不断调用 xmppMana ...

  6. iOS开发基础block的形式讲解

    前几个星期,我利用通知写了一个仿京东选择地址的Demo(http://blog.csdn.net/hbblzjy/article/details/52212879),后来看过一篇文章说,尽量少用通知, ...

  7. MyBatis进阶(一)运行原理

    初次学习MyBatis,自己花了不少时间,理解一件事物是需要时间的.经过多次反复的理解,你的认知能力就可以得到提升.以下是学习MyBatis的一些理解认识,技术理解上若有不当之处,敬请朋友们提出宝贵意 ...

  8. 【翻译】在Ext JS 6通用应用程序中使用既共享又特定于视图的代码

    原文:Using Both Shared and View-Specific Code in an Ext JS 6 Universal App 在本文,在展示如何编写Ext JS 6通用应用程序代码 ...

  9. Dynamics CRM2013 注释中的内容无法正常显示问题

    CRM2013中在表单中插入注释,并把注释设置成默认选项卡后 打开一个已经挂了附件的表单,但却显示找不到记录 必须要再点击下注释,内容才会出来 查了半天不得其解,终于在ur1 for CRM2013  ...

  10. Install and run DB Query Analyzer 6.04 on Microsoft Windows 10

          Install and run DB Query Analyzer 6.04 on Microsoft Windows 10  DB Query Analyzer is presented ...