1

数学是很久以前的事了,我不确定我想要什么,也不知道如何计算它。想象一下,我知道我有从 1 到 100 的数字。我想给用户一个选择器/组合框,以便能够选择其中一些数字。但我不想要选择器中的所有数字。也许它显示数字 1,2,3,4,5,10,15,25,40,60,80,90,100。用我的话来说,它开始缓慢上升,然后变得更陡峭。我认为指数函数太陡了。

最终,如果有人可以向我展示如何创建一个客观的 C 方法,该方法接受两个数字并返回和 NSNumbers 数组,我会喜欢它,类似于我上面显示的。

提前谢谢大家。

4

3 回答 3

1

三角数列怎么样?

方程: x n = n(n+1)/2

序列(从 n = 0 开始):0、1、3、6、10、15、21、28、36、45、55、66、78、91、105、120、136、153、171、190、210 , 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, ...

输入:1 到 100

最小值 = 1 ,最大值 = 100

1 + 0 = 1

1 + 1 = 2

2 + 3 = 5

5 + 6 = 11

11 + 10 = 21

21 + 15 = 36

36 + 21 = 57

依此类推..直到评估的数量超过最大值

序列: 1、2、5、11、21、36、57 等等...

输入:1000 到 10000

最小值 = 1000 ,最大值 = 10000

1000 + 0 = 1000

1000 + 1 = 1001

1001 + 3 = 1004

1004 + 6 = 1010

1010 + 10 = 1020

1020 + 15 = 1035

1035 + 21 = 1056

依此类推..直到评估的数量超过最大值

序列: 1000、1001、1004、1010、1020、1035、1056 等...

我将把实现部分留给您尝试。

于 2013-03-25T19:32:26.540 回答
0

我写了一些代码来生成

-(NSArray *)generateNumbersFromBeginning:(int)begin toEnd:(int)end withCount:(int)count
{
    NSMutableArray * genNumbers=[NSMutableArray new];

    double sqBegin=1.0; //our beginning generator

    double sqEnd  =sqrt((double)(end-begin)); // last element to produce

    double step = (sqEnd-sqBegin)/((double)count);//

    double power=1.0;

    NSLog(@"%f %f %f",sqBegin,sqEnd,step);

    for (int a= 0; a<count; a++) {

        sqBegin+=step;

        power += 1.0/(double)count;

        int genNumber=(int)(pow(sqBegin, power));

        genNumber+=begin;

        [genNumbers addObject:[NSNumber numberWithInt:genNumber]];

    }

    NSLog(@"numbers are: %@ ",genNumbers);

    return genNumbers;


}

用法是 ([a,b], x) 其中 a 是起点 b 是终点,x 是在该范围内生成的 int 数。

例如:

[self generateNumbersFromBeginning:9000 toEnd:10000 withCount:36];

这个调用的结果是:

numbers are: (
    9001,
    9002,
    9003,
    9005,
    9006,
    9008,
    9010,
    9012,
    9014,
    9017,
    9021,
    9025,
    9029,
    9034,
    9041,
    9048,
    9056,
    9065,
    9076,
    9089,
    9104,
    9121,
    9141,
    9165,
    9192,
    9223,
    9259,
    9301,
    9350,
    9407,
    9473,
    9549,
    9638,
    9741,
    9860,
    9999
) 
于 2013-03-26T14:49:43.880 回答
0

我不是 100% 确定您在寻找什么,但您可以使用一个简单的等式,例如:

f(x) = floor(x c ) 其中 c > 1

您可以将 c 设置为提供所需陡度的任何数字。例如。对于 c = 1.5,您将有:

0, 1, 2, 5, 8, 11, 14, 18, 22, 27, 31, 36, 41, 46, 52, 58, 64, 70, 76, 82, 89, 96, 103, 110, 117, 125...

要调整不同的起始值 s,只需执行 f(x, s) = floor(x c ) + s。


另一种可能的功能是由一系列陡峭度逐渐增加的线组成。例如,这是一条由线段组成的“抛物线”:

f(x, s) = 0.5cd(地板(x/d)) 2 + 0.5cd(地板(x/d)) + c(地板(x/d) + 1)(x mod d) + s

其中 c 和 d 是您选择的常数 (≥ 1)(并且推导有点烦人)。c是初始线的斜率,d表示线段的长度。s 再次是起始值。例如,让 s = 100, c = 3, d = 4,你有以下序列(对于 x = 0, 1, 2, ...):

100, 103, 106, 109, 112, 118, 124, 130, 136, 145, 154, 163, 172, 184, 196, 208, 220, 232, 247...

现在,如果我们想要“整数”,我们会将 c 和 s 设置为“整数”。但是如果我们想从一个开始计数,我们可以定义如下:

g(x) = x             when x = 0, 1, 2, 3, 4
     = f(x - 5, 5)   when x ≥ 5

因此,如果 c = 5 且 d = 5,我们有如下序列:

0, 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 80, 95, 110, 125, 140, 155, 175, 195, 215, 235, 255, 280, 305, 330, 355, 380, 410, 440, 470, 500, ...


*当然,要在给定的最大值之前停止,只需在函数返回大于所需最大值的数字时停止评估函数。

于 2013-03-26T18:18:25.063 回答