题目分析:
本题是由对角线由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|;