How do you find which row and column a number belongs to in Floyd Triangle

时光毁灭记忆、已成空白 提交于 2019-12-08 10:44:00

问题


How do you find which row and column does a number belongs to in Floyd Triangle? 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

For example,

  • 33 is in the 8th row and 5th column (input 33 → output 8th row, 5th column)
  • 46 is in the 10th row and 1st column
  • 27 is in the 7th row and 6th column

Thank you so much in advance!


回答1:


Note that n-th row ends with value n*(n+1)/2. So you can make quadratic equation and solve it to get row number for given number 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 

For example, for k=33 you can calculate

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

Having n_row, find the last number of previous row and position of k in the current row

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

Pseudocode for alternative method of row finding:

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



回答2:


I think that this approach is somehow more natural:

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


来源:https://stackoverflow.com/questions/39467778/how-do-you-find-which-row-and-column-a-number-belongs-to-in-floyd-triangle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!