用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. 20 ViewPager总结

    V4:兼容到1.6,V7:兼容到 2.1,V13:兼容到3.2(平板) 兼容包 ViewPager 父类: android.support.v4.view.ViewPager ViewPager:滑动 ...

  2. Android开源框架ViewPagerIndicator的基本使用

    转载本博客请注明出处:点击打开链接    http://blog.csdn.net/qq_32059827/article/details/52495647 很多新闻资讯类的app都有一些共性,那就是 ...

  3. ScheduledExecutorService和timer的异同

    先来个传统的Timer的例子: package com.jerry.concurrency; import java.text.ParseException; import java.text.Sim ...

  4. UNIX网络编程——进程间通信概述

    一.顺序程序与并发程序特征 顺序程序特征 顺序性封闭性:(运行环境的封闭性)确定性可再现性 并发程序特征 共享性并发性随机性 二.进程互斥 1.由于各进程要求共享资源,而且有些资源需要互斥使用,因此各 ...

  5. Android存储之SharedPreferences

    Android数据存储之SharedPreferences SharedPreferences对象初始化 SharedPreferences mSharedPreferences = getShare ...

  6. ORA-12519: TNS:no appropriate service handler found 解决

    select count(*) from v$process --当前的连接数select value from v$parameter where name = 'processes' --数据库允 ...

  7. 【一天一道LeetCode】#231. Power of Two

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  8. J2EE学习从菜鸟变大鸟之九 深入浅出理解 Servlet-----实例解析

    关于Servlet的基础内容在前面已经和大家分享过了,参考J2EE学习从菜鸟变大鸟之七 Servlet,现在结合到DRP中学习,深刻的体会Servlet起到了枢纽中转的作用,控制逻辑(到MVC中更像是 ...

  9. 银联在线 网关支付 (JAVA版)

    这一版本的编写是在我上一次博客的基础上写的,有不懂得童鞋可以先看下我的原先在线支付的博客,熟悉下:http://blog.csdn.net/yulei_qq/article/details/45197 ...

  10. 小试ImageMagik——开发篇

    ===================================================== ImageMagick的使用和开发的文章: 小试ImageMagik--使用篇 小试Imag ...