首页 > 试题广场 >

疯狂序列

[编程题]疯狂序列
  • 热度指数:192 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
东东从京京那里了解到有一个无限长的数字序列: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, ...(数字k在该序列中正好出现k次)。东东想知道这个数字序列的第n项是多少,你能帮帮他么

输入描述:
输入包括一个整数n(1 ≤ n ≤ 10^18)


输出描述:
输出一个整数,即数字序列的第n项
示例1

输入

169

输出

18
#include <stdio.h>
#include <math.h>
#include <vector>
using namespace std;
 
int main()
{
    long long n;
    while (scanf("%lld",&n) != EOF) {
        vector<long long> nums;
        nums.push_back((long long)sqrt(2*n)-1);
        nums.push_back((long long)sqrt(2*n));
        nums.push_back((long long)sqrt(2*n)+1);
        int tmp=0;
        for (int i=0;i<nums.size();i++) {
            if (nums[i]*nums[i]-nums[i]+2<=2*n && 2*n<=nums[i]*nums[i]+nums[i]) {
                tmp = nums[i];
                break;
            }
        }
        printf("%d\n",tmp);
    }
}

发表于 2019-08-23 15:58:10 回复(0)

def start(n):
    end = [1]
    # 第一个序列为第一项
    for i in range(n):
        end.append(end[i] + i + 2)
        if n <= end[i]:
            if i == 0:
                return 1
            return end[i] - end[i-1]

if __name__=='__main__':
    num = int(input())
    print(start(num))

发表于 2020-03-21 14:37:19 回复(0)