一个序列是1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5....这样排的,求第n个是什么数字。

分析

第n个位置属于1到k,求出k,然后n-i*(i-1)/2就是答案了。

方法1:可以枚举k为i,当i*(i+1)/2大于等于n时,k就是i了。

方法2:先让k=floor(sqrt(2*n)),如果k*(k+1)/2<n,那正确的k应该+1。

代码

方法1的写法1:

#include<cstdio>
int main()
{
    long long n,i;
    scanf("%lld",&n);
    for(i=1; i<=1e8; i++)
    {
        if(i*(i+1)/2>=n) break;
    }
    printf("%lld",n-i*(i-1)/2);
    return 0;
}

 

方法1的写法2:

#include<cstdio>
int main()
{
    long long n,i;
    scanf("%lld",&n);
    i=1;
    while(i*(i+1)/2<n)
    {
        i++;
    }
    printf("%lld",n-i*(i-1)/2);
    return 0;
}

 

方法2

#include<cstdio>
#include<cmath>

int main()
{
    long long n,k;

    scanf("%lld",&n);
    k=floor(sqrt(2*n));
    if (k*(k+1)/2<n)
    {
        k++;
    }
    printf("%lld",n-k*(k-1)/2);
    return 0;
}

 


┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆