Const的数表

捕获

题目分析:

本题是由对角线由1起,每次递增以,交替循环。
1 2 6 7 15 16
3 5 8 14 17  
4 9 13 18    
10 12 19      
11 20        
21          

如上表:红黑交替,每次递增1.

以以每条对角线为整体,前k条对角线一共有:1+2+3+4+5+6+7+8+9+……+k+……(k表示第k条对角线)个数。

现在要确定输入数n的所行与列。先确定所在的对角线k,然后确定其行与列,如果是正循环,即红色的循环方向,则行i为s-n+1,列k-s+n。如果是逆循环,即黑色的方向,则互换。

My Code:

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n;
    cout << "Enter some numbers(Ctr+Z to end):" << endl;
    while(cin >> n)
    {
        int k = 1, s = 0;
        
        while(s < n)
        {
            s += k;
            ++k;
        }
        --k;
        /*
        int k = (int) floor((sqrt(8.0*n+1)-1)/2-1e-9)+1;
        int s = k*(k+1)/2;
        */
        if(k%2)
            cout << s-n+1 << "/" << k-s+n << endl;
        else
            cout << k-s+n << "/" << s-n+1 << endl;
    }
    return 0;
}

也可以用数学公式直接求解,n >= (1+2+3+……+k+……) = k*(k+1)/2;

带入二次函数求值公式得,k=|(-1+(1+8*n)^1/2)/2|;

原文地址:https://www.cnblogs.com/sanghai/p/2770479.html