嵌套循环, 
for(){
     for(){}
}

解决方案 »

  1.   


                //在循环时分别为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);
      

  2.   

                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));
      

  3.   

    补充一下RandomData变量为楼主所说的16,17
    resultLevel变量为层数
     resultLastData 变量为他对应的上面一层
      

  4.   

    // number: 传入值,q:公比
            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 );
            }        
      

  5.   

    9楼中代码 indexOfCurrentLayer/3 改为indexOfCurrentLayer/q
      

  6.   


    /// <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;
            }
        }
    }
      

  7.   

    最简单的方法为
                int n = 16;
                MessageBox.Show("在第" + (Math.Round(Math.Log(n, 3)) +1) + "层,上层是" + Math.Round(n / 3.0));
      

  8.   

    修复一下,因为小数位的关系上边的5是个 bug,精确点得到下方的代码            int n = 16;
                MessageBox.Show("在第" + (Math.Round(Math.Log(n, 3) + 0.05) + 1) + "层,上层是" + Math.Round(n / 3.0));
                return;