如何计算一系列数字的某些点数

时间:2013-03-25 19:15:55

标签: ios objective-c math

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

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

先谢谢大家。

3 个答案:

答案 0 :(得分:1)

Sequence of Triangular Number怎么样?

公式: 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等......

我将离开实施部分供您试用。

答案 1 :(得分: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
) 

答案 2 :(得分: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(floor(x / d)) 2 + 0.5cd(floor(x / d))+ c(floor(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,......


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