C#公式确定索引

Posted

技术标签:

【中文标题】C#公式确定索引【英文标题】:C# formula to determine index 【发布时间】:2013-11-07 13:24:30 【问题描述】:

我的程序中有数学问题。我认为问题很简单,但我不确定要使用哪些术语,因此我自己的搜索没有返回任何有用的信息。

我在一个方法中收到一些值,我唯一知道的(就逻辑而言)是数字是可以复制的。

换句话说,我可以收到的数字是可以预测的,并且会是以下之一

1
2
4
16
256
65536
etc

我需要知道它们出现在哪个索引处。换句话说,1 总是在索引02 在索引14 在索引316 在索引4 等处。

我知道我可以写一个大的 switch 语句,但我希望公式会更整洁。你知道是否存在或任何线索作为我正在使用的数学论坛的名称。

【问题讨论】:

numbers will be something which can be duplicated 这些看起来更像是 2 的幂。 @tnw,这表明我的数学有多糟糕!至少我可以开始查找了,谢谢 除1外,每个数都是前一个平方 它看起来像几何级数 和c#有什么关系? 【参考方案1】:

您列出的数字是 2 的幂。将数字提高到幂的反函数是对数,所以这就是您用来从(在这里使用您的术语)数字倒退到索引的方法。

var num = 256;
var ind = Math.Log(num, 2);

以上,ind 是 num 的 base-2 对数。此代码适用于任何基础;只需将该基础替换为2。如果您只打算使用 2 的幂,那么您可以使用基于输入的按位表示更快的特殊情况解决方案;见What's the quickest way to compute log2 of an integer in C#?

【讨论】:

我实际上在计算器上查看了日志,因为我猜到了一些类似的东西,但我永远不会解决这个问题。再次乔恩,谢谢你。 在这种情况下,“4”将不适合索引[3] :)【参考方案2】:

试试

Math.Log(num, base)

base 是 2 MSDN:http://msdn.microsoft.com/en-us/library/hd50b6h5.aspx

对数将从您的数字返回到您的底数。 但如果你的数字真的是 2 的幂, 否则你必须准确地了解你拥有什么,你需要什么 看起来 numbers 被 2 供电两次,所以试试这个:

private static int getIndexOfSeries(UInt64 aNum)
 
    if (aNum == 1)
        return 0;
    else if (aNum == 2)
        return 1;
    else
    
        int lNum = (int)Math.Log(aNum, 2);
        return 1+(int)Math.Log(lNum, 2);
    

UInt64[] Arr = new UInt64[] 1, 2, 4, 16, 256, 65536, 4294967296 的结果是:

Num[0] = 1
Num[1] = 2
Num[2] = 4
Num[3] = 16
Num[4] = 256
Num[5] = 65536
Num[6] = 4294967296 //65536*65536

在哪里[i] - 索引

【讨论】:

【参考方案3】:

你应该计算以 2 为底的对数

【讨论】:

【参考方案4】:

提示:对于结果:

0 2
1 4
2 16
3 256
4 65536
5 4294967296
etc.

公式是,给定整数 x:

Math.Pow(2, Math.Pow(2, x));

那是

2 to the power (2 to the power (x) )

一旦知道公式,就可以解出 x (因为你已经得到了答案,所以我不会讲)。

【讨论】:

以上是关于C#公式确定索引的主要内容,如果未能解决你的问题,请参考以下文章

想用C#做一个类似于excel里的公式库以及公式的运算模块,可以自定义函数,并可以解析公式并运算

在索引/匹配公式中求和

FluentNHibernate 公式映射 C#

处理重复的索引最小公式

如何为多变量索引匹配公式创建 UDF

使用索引/匹配的 Excel 公式