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

  • 相关阅读:
    IO流
    简单JSON
    开发流程
    命名规范
    策略模式
    Git的使用
    Markdown的使用
    代理模式
    装饰者模式
    POJ 2976 3111(二分-最大化平均值)
  • 原文地址:https://www.cnblogs.com/sanghai/p/2770479.html
Copyright © 2020-2023  润新知