//在循环时分别为1 4 13 40 ... double basedata = 1; int ratio = 3; int RandomData = 1; //第几层(做循环) int tmp=0; //第几层 int resultLevel = 1; //他对应的上面一层是 int resultLastData = 0; while (RandomData > basedata) { tmp++; basedata += Math.Pow(ratio,tmp); } resultLevel = tmp + 1; resultLastData = (int)((basedata - Math.Pow(ratio, tmp) - Math.Pow(ratio, tmp - 1)) + 1 + (RandomData - 1 - basedata + Math.Pow(ratio, tmp)) / 3);
int n = 16; int k = 0; int m = n; while (m > 0) { m = m - Convert.ToInt32(Math.Pow(3, k)); k++; } MessageBox.Show("在第" + k + "层,上层是" + Math.Round(n / 3.0));
//在循环时分别为1 4 13 40 ...
double basedata = 1;
int ratio = 3;
int RandomData = 1;
//第几层(做循环)
int tmp=0;
//第几层
int resultLevel = 1;
//他对应的上面一层是
int resultLastData = 0; while (RandomData > basedata)
{
tmp++;
basedata += Math.Pow(ratio,tmp);
}
resultLevel = tmp + 1;
resultLastData = (int)((basedata - Math.Pow(ratio, tmp) - Math.Pow(ratio, tmp - 1)) + 1 + (RandomData - 1 - basedata + Math.Pow(ratio, tmp)) / 3);
int k = 0;
int m = n;
while (m > 0)
{
m = m - Convert.ToInt32(Math.Pow(3, k));
k++;
}
MessageBox.Show("在第" + k + "层,上层是" + Math.Round(n / 3.0));
resultLevel变量为层数
resultLastData 变量为他对应的上面一层
private static void PyramidNumbers( int number, int q )
{
if ( number < 1 ) Console.WriteLine( "wrong input number" ); int currentLayer = 0;
int numberInPreviousLayer = -1;
if ( number <= q + 1 )
{
if ( number == 1 )
{
currentLayer = 1; numberInPreviousLayer = -1;
}
else
{
currentLayer = 2;
numberInPreviousLayer = 1;
}
}
else
{
int result = number / q;
while ( result != 0 )
{
currentLayer++;
result = result / q;
} currentLayer = currentLayer + 2; int currentLayerHead = (int)( ( 1 - Math.Pow( q, currentLayer - 1 ) ) / ( 1 - q ) + 1 );
int previousLayerHead = (int)( ( 1 - Math.Pow( q, currentLayer - 2 ) ) / ( 1 - q ) + 1 );
int indexOfCurrentLayer = number - currentLayerHead; numberInPreviousLayer = indexOfCurrentLayer / 3 + previousLayerHead;
} Console.WriteLine( "The number {0} is in layer: {1}", number, currentLayer );
Console.WriteLine( "The mapping number in up layer is {0}", numberInPreviousLayer );
}
/// <summary>
///
/// </summary>
/// <param name="layer">返回第几层</param>
/// <param name="upper">返回映射上层哪个</param>
/// <param name="value">输入值</param>
static void Fun(ref int layer, ref int upper, int value)
{
if (value == 1)
{
layer = 1; upper = 1;
return;
}
int result = 1;
double pow = 0;
for (int i = 2; i < int.MaxValue; i++)
{
pow = Math.Pow(3, i - 2);
result = (int)(result + pow);
if (value >= result && value <= (result + pow * 3 - 1))
{
layer = i;
upper = (int)Math.Round(value / 3f);
break;
}
}
}
int n = 16;
MessageBox.Show("在第" + (Math.Round(Math.Log(n, 3)) +1) + "层,上层是" + Math.Round(n / 3.0));
MessageBox.Show("在第" + (Math.Round(Math.Log(n, 3) + 0.05) + 1) + "层,上层是" + Math.Round(n / 3.0));
return;