【问题标题】:How do you find which row and column a number belongs to in Floyd Triangle如何在弗洛伊德三角形中找到数字所属的行和列
【发布时间】:2016-09-13 10:27:57
【问题描述】:

如何在弗洛伊德三角形中找到一个数字属于哪一行和哪一列? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

例如,

  • 33在第8行第5列(输入33→输出第8行第5列)
  • 46在第10行第1列
  • 27在第7行第6列

非常感谢您!

【问题讨论】:

  • 抱歉,好像被删除了。
  • @AmiTavory,OP 大概开始输入标签并尝试使用“Floyd”。 Floyd-Warshall 弹出,OP 在不知道 Floyd-Warshall 的确切含义的情况下点击了它。我已删除标签,您的评论已过时。

标签: algorithm math pascals-triangle triangular


【解决方案1】:

注意第 n 行 ends with value n*(n+1)/2。所以你可以制作二次方程并求解它以获得给定数字k的行号

n*(n+1)/2 = k
n^2 + n - 2*k = 0
D = 1 + 8*k
n_row = Ceil((-1 + Sqrt(D)) / 2)   //round float value up 

例如,对于k=33,你可以计算

   n_row = Ceil((-1 + Sqrt(265)) / 2) = 
           Ceil(7.639) =
           8

有n_row,求上一行的最后一个数和k在当前行中的位置

  n_Column = 33 - n_row * (n_row - 1) / 2 = 
            33 - 28 = 
            5 

替代行查找方法的伪代码:

 sum = 0
 row = 0
 while sum < k do
      row++  
      sum = sum + row

【讨论】:

  • 谢谢你的回答,如何在没有sqrt的情况下递归查找?
  • @beeant 只需添加数字 1,2,3... 直到总和超过给定数字
  • 我尝试将公式应用到代码中。你认为 D = 1-8*k 应该是 D = 1 + 8 * k 吗?
  • 1、2、3在哪里加?
  • 总和 = 0; 0+1=1; 1+2=3; 3+3 =6; 6+4=10;...(查看我的三角数链接)
【解决方案2】:

我认为这种方法更自然:

       #include <iostream>
       size_t getRow(size_t n)
       { // just count the rows, and when you meet the number, return the row
           size_t row(0), k(1);
           for (row = 1; row <= n; row++)
           {
               for (size_t j = 1; j <= row; j++)
               {
                   if (k == n)
                   {
                       goto end;
                   }
                   k++;
               }
           }
           end:return row;
       }
       size_t getCol(size_t n)
       { /* well, we have already found the row, so now knowing that every n-th row starts
       with n(n-1)/2+1 and ends with n(n+1)/2, just count the columns and when you
       meet the number (and that surely will happen), just return the column and you're done*/
           size_t col(1);
           size_t r = getRow(n);
           for (size_t j = r * (r - 1) / 2+1; j <= r*(r+1)/2; j++)
           {
               if (j == n)
               {
                   break;
               }
               col++;
           }    
           return col;
       }
       int main()
       {
           size_t n;
           std::cin >> n;
           std::cout << "Number " << n << " lies in row " << getRow(n) << ", column " << getCol(n) << " of the Floyd's triangle.\n";

           return 0;
       }

【讨论】:

    【解决方案3】:

    在 python 中是这样的(如果你不想使用sqrt):

    def rc(n):
        # rc(1) = (1, 1); rc(33) -> (8, 5)
        assert n > 0 and int(n) == n
        sum = 0
        row = 0
        while sum < n:
            row += 1
            sum += row
        col = n - sum + row
        return row, col
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 2018-11-15
      • 2018-03-19
      • 2020-03-16
      • 1970-01-01
      • 2013-03-28
      相关资源
      最近更新 更多