啊哈(算法)挑战

以下是几个简单的算法解析,你也可以只看题目,进行挑战,希望有更高效的算法
啊哈挑战官网

  1. 题目:153是一个非常优美的数
    153=1*1*1+5*5*5+3*3*3
    你知道在三位整数 (abc) 中,满足 abc=a*a*a+b*b*b+c*c*c 这个条件的最大的整数是什么?
解答:
- (void)viewDidLoad {
    [super viewDidLoad];
    NSInteger max = [self calculateMax];
    NSLog(@"max==========%zd", max);
}
- (NSInteger)calculateMax {
    NSMutableArray *arrayM = [NSMutableArray array];
    for (NSInteger i = 100; i <= 999; i++) {
        // 分别获取字符串的第一个,第二个,第三个字符
        NSString *numString = [NSString stringWithFormat:@"%zd", i];
        NSInteger x = [[numString substringWithRange:NSMakeRange(0,1)] intValue];
        NSInteger y = [[numString substringWithRange:NSMakeRange(1,1)] intValue];
        NSInteger z = [[numString substringWithRange:NSMakeRange(2,1)] intValue];
        
        NSString *xyzString = [NSString stringWithFormat:@"%ld%ld%ld", (long)x, (long)y, (long)z];
        NSInteger xyz = [xyzString integerValue];
        NSInteger xyzMul = x*x*x + y*y*y + z*z*z;
        if (xyz == xyzMul) {
            [arrayM addObject:@(xyz)];
        }
    }
    NSNumber *resultNum = arrayM.lastObject;
    NSLog(@"resultNum==========%@", resultNum);
    NSInteger max = [resultNum integerValue];
    return max;
}

答案: 407

  1. 题目: 请问1~123456之间所有7的倍数和末尾含7的数的和是?
- (void)viewDidLoad {
    [super viewDidLoad];
    long long sum = [self calculateSumLow:1 high:123456 divisor:7];
    NSLog(@"0~123456sum=============%lld", sum);
}
- (long long)calculateSumLow:(long long)low high:(long long)high divisor:(long long)divisor {
    NSMutableArray *arrayM = [NSMutableArray array];
    for (long long i = 1; i <= high; i ++) {
        NSString *numString = [NSString stringWithFormat:@"%lld", i];
        long long lastNum = [[numString substringFromIndex:numString.length-1] longLongValue];
        if (i%divisor==0 || lastNum == divisor) {
            [arrayM addObject:@(i)];
        }
    }
    long long sum = 0;
    for (NSNumber *num in arrayM) {
        long long k = [num longLongValue];
        sum = sum+k;
    }
    return sum;
}

答案: 28217

  1. 题目:斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21……从第三项开始每一项是前两项的和。
    请问斐波那契数列第45项是多少呢?
    更多斐波那契数列的知识,请访问百度百科。
- (void)viewDidLoad {
    [super viewDidLoad];
    long long FibonacciItemNum = [self calculateFibonacciSequenceItem:45];
    NSLog(@"itemNum========%lld", FibonacciItemNum);
}
- (long long)calculateFibonacciSequenceItem:(long long)item {
    NSMutableArray *arrayM = [NSMutableArray array];
    for (long long i=0; i<=1; i++) {
        [arrayM addObject:@(1)];
    }
    for (long long i = 2; i <= item-1; i++) {
        long long num = 0;
        if (i >= 2) {
            num = [arrayM[i-1] longLongValue] + [arrayM[i-2] longLongValue];
            [arrayM addObject:@(num)];
        }
    }
    
    NSLog(@"-----------%lld,%@,%@", [arrayM.lastObject longLongValue], arrayM[arrayM.count-2], arrayM[arrayM.count-3]);
    NSLog(@"FibonacciArrayM==========%@", arrayM);
    return [arrayM.lastObject longLongValue];
}

答案: 1134903170

  1. 题目:2~12345中有多少个质数?
- (void)viewDidLoad {
    [super viewDidLoad];
    long long primeNumberCount = [self calculatePrimeNumberCount:2 high:12345];
    NSLog(@"primeNumberCount============%lld", primeNumberCount);
}
- (long long)calculatePrimeNumberCount:(long long)low high:(long long)high {
    NSMutableArray *arrayM = [NSMutableArray array];
    for (long long i = 2; i < high; i++) {
        BOOL isPrime = [self isPrime:i];
        if (isPrime==YES) {
            [arrayM addObject:@(i)];
        }
    }
    return arrayM.count;
}
/// 判定一个数是否是素数:prime number
- (BOOL)isPrime:(long long)N {
    if (N < 2) {
        return NO;
    }
    for (NSInteger i = 2; i*i <= N; i++) {
        if (N % i == 0) {
            return NO;
        }
    }
    return YES;
}

答案: 1474

  1. 题目: 质数和, 2 ~ 10以内的质数有2,3,5,7。所以2 ~ 10之间所有质数的和是17。
    那么2 ~ 100之间所有质数的和是?
- (void)viewDidLoad {
    [super viewDidLoad];
    long long primeNumberSum = [self calculatePrimeNumberSumLow:2 high:100];
    NSLog(@"primeNumberSum========%lld", primeNumberSum);
}
- (long long)calculatePrimeNumberSumLow:(long long)low high:(long long)high{
    NSArray *primeArray = [self calculatePrimeNumber:low high:high];
    long long sum = 0;
    for (NSNumber *num in primeArray) {
        sum = sum + [num longLongValue];
    }
    return sum;
}
- (NSArray *)calculatePrimeNumber:(long long)low high:(long long)high {
    NSMutableArray *arrayM = [NSMutableArray array];
    for (long long i = low; i < high; i++) {
        BOOL isPrime = [self isPrime:i];
        if (isPrime==YES) {
            [arrayM addObject:@(i)];
        }
    }
    NSArray *array = arrayM.copy;
    return array;
}
/// 判定一个数是否是素数:prime number
- (BOOL)isPrime:(long long)N {
    if (N < 2) {
        return NO;
    }
    for (NSInteger i = 2; i*i <= N; i++) {
        if (N % i == 0) {
            return NO;
        }
    }
    return YES;
}

答案: 1060

  1. 题目: 最大质因子,将20分解质因数20=2*2*5,5是最大的质因子。那么将987654321分解质因数,所得到的最大的质因子是?
/*
 解析:
 Pollard Rho因数分解
 1975年,John M. Pollard提出了 Pollard Rho 快速因数分解的方法。该算法时间复杂度为O(n^(1/4))。
 
 分解质因数代码:
 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
 (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,
  重复执行第一步。
 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
 */
- (void)viewDidLoad {
    [super viewDidLoad];
    long long maxPrimeFactor = [self calculateMaxPrimeFactorWithNum:987654321];
    NSLog(@"maxPrimeFactor==========%lld", maxPrimeFactor);
}
- (long long)calculateMaxPrimeFactorWithNum:(long long)num {
    for(long long i=2;i<=num;i++)
        while(num!=i) {
            if(num%i==0) {
                printf("%lld",i);
                num=num/i;
            }
            else {
                break;
            }
        }
    return num;
}

答案: 379721

  1. 题目: 相差为2的两个质数称为孪生质数。例如3和5是一对孪生质数,41和43也是一对孪生质数。那么100~200之间共有多少对孪生质数呢?
- (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableArray *twinPrimeArrayM = [self calculateTwinPrimeLow:100 high:200];
    long long twinPrimeCount = twinPrimeArrayM.count;
    NSLog(@"twinPrimeCount====== %lld", twinPrimeCount);
    NSLog(@"twinPrimeArrayM====== %@", twinPrimeArrayM);
}
- (NSMutableArray *)calculateTwinPrimeLow:(long long)low high:(long long)high {
    NSArray *primeArray = [self calculatePrimeNumber:low high:high];
    long long preNum = 0;
    long long nextNum = 0;
    CGPoint point = CGPointMake(preNum, nextNum);
    NSMutableArray *twinPrimeArrayM = [NSMutableArray array];
    for (long long i = 1; i < primeArray.count; i++) {
        long long diffNum = [primeArray[i] longLongValue] - [primeArray[i-1] longLongValue];
        if (diffNum == 2) {
            point = CGPointMake([primeArray[i-1] longLongValue], [primeArray[i] longLongValue]);
            NSValue *pointValue = [NSValue valueWithCGPoint:point];
            [twinPrimeArrayM addObject:pointValue];
        }
    }
    return twinPrimeArrayM;
}
- (NSArray *)calculatePrimeNumber:(long long)low high:(long long)high {
    NSMutableArray *arrayM = [NSMutableArray array];
    for (long long i = low; i < high; i++) {
        BOOL isPrime = [self isPrime:i];
        if (isPrime==YES) {
            [arrayM addObject:@(i)];
        }
    }
    NSArray *array = arrayM.copy;
    return array;
}
/// 判定一个数是否是素数:prime number
- (BOOL)isPrime:(long long)N {
    if (N < 2) {
        return NO;
    }
    for (NSInteger i = 2; i*i <= N; i++) {
        if (N % i == 0) {
            return NO;
        }
    }
    return YES;
}

答案: 7

  1. 题目: 某一天早晨,有一个猴子摘下了若干个桃子,当即就吃了一半,还不过瘾,又多吃了一个.第二天又将剩下的桃子吃了一半多一个,以后每天早上都吃了前一天剩下的一半多一个.到第10天的时候再想吃的时,发现只剩下一个桃子了.这个贪吃的猴子第一天究竟摘了多少个桃子呢?
- (long long)calculateMomkeyPickPeachWithDays:(long long)days {
    long long count = 1;    // 初始化第十天桃子的个数
    for (long long i = 1; i < days; i++) {
        count = (count + 1)*2;  // 从倒数第二天开始计算
    }
    return count;
}

答案: 1534

  1. 题目:请在5483298756中插入3个乘号,使得乘积最大?请问乘积最大是多少?
- (void)viewDidLoad {
    [super viewDidLoad];
    long long maxMultiplier = [self calculateMaxMultiplier:5483298756];
    NSLog(@"maxMultiplier========== %lld", maxMultiplier);
}
- (long long)calculateMaxMultiplier:(long long)num {
    NSString *numString = [NSString stringWithFormat:@"%lld", num];
    NSMutableArray *arrayM = [NSMutableArray array];
    for (NSInteger i = 1; i < numString.length; i++) {
        NSString *firstString = [numString substringWithRange:NSMakeRange(0,i)]; // 截取第一个数:从第一个字符开始,截取i个
        long long firstNum = [firstString longLongValue];
        NSString *remain1 = [numString substringWithRange:NSMakeRange(i,numString.length-i)];
        for (NSInteger j = 1; j < remain1.length; j++) {
            NSString *secondString = [remain1 substringWithRange:NSMakeRange(0, j)];
            long long secondNum = [secondString longLongValue];
            NSString *remain2 = [remain1 substringWithRange:NSMakeRange(j, remain1.length-j)];
            for (NSInteger k = 1; k < remain2.length; k++) {
                NSString *thirdString = [remain2 substringWithRange:NSMakeRange(0, k)];
                long long thirdNum = [thirdString longLongValue];
                NSString *forthString = [remain2 substringWithRange:NSMakeRange(k, remain2.length-k)];
                long long forthNum = [forthString longLongValue];
                long long multiplierNum = firstNum * secondNum *thirdNum * forthNum;
                [arrayM addObject:@(multiplierNum)];
            }
        }
    }
    // 进行排序
    NSArray *array = arrayM;
    NSArray *comparableArray = [self insertionComparable:array];
    NSLog(@"comparableArray========= %@", comparableArray);
    long long maxMultiplier = [comparableArray.lastObject longLongValue];
    return maxMultiplier;
}
/// 2. 插入排序
- (NSArray *)insertionComparable:(NSArray *)array {
    NSMutableArray *arrayM = [NSMutableArray array];
    for (NSNumber *num in array) {
        [arrayM addObject:num];
    }
    NSInteger N = arrayM.count;
    // 将array按升序排列
    for (NSInteger i = 1; i<N; i++) {
        // 将 a[i] 插入到 a[i-1]、a[i-2]、a[i-3]...之中
        for (NSInteger j = i; j>0 && arrayM[j] < arrayM[j-1]; j--) {
            [arrayM exchangeObjectAtIndex:j withObjectAtIndex:j-1];
        }
    }
    NSArray *comparableArray = arrayM.copy;
    return comparableArray;
}

答案: 3540506112

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容