首页 > 试题广场 > 数字序列第n位的值
[编程题]数字序列第n位的值
有一个无限长的数字序列1,2,2,3,3,3,4,4,4,4,5,5,5,5,5。。。(数字序列从1开始递增,且数字k在该序列中正好出现k次),求第n项是多少

输入描述:
输入为一个整数n


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

输入

4

输出

3

备注:
如:输入为3,有序数列第3项的值为2,则输出为2
Java解答
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int i = input.nextInt();
        int n = 1;
        while(i>0){
            i = i-n;
            n++;
        }
        System.out.println(n-1);
    }
}

编辑于 2019-08-02 19:47:48 回复(0)
等差数列类问题,1 22 333 444 ..是等差数列: 1 2 3 4 ... n(即n代表的就是当前数字出现的次数),由等差数列求和公式,只需要有S = (1 + i)*i/2 >= n 即可求出i了,i就是当前的答案
 
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner input  = new Scanner(System.in);
        int n = Integer.parseInt(input.nextLine());
        
        for (int i = 1; i <= n; i++) {
            if ((1 + i) * i / 2 >= n) {
                System.out.println(i);
                break;
            }
        }
        
    }
}

发表于 2019-09-12 14:03:17 回复(0)
#include<iostream>
using namespace std;
int main(){
    int n, i = 1, count = 1;
    cin >> n;
    while(count < n){
       i++;                     //i相当于层数,可想象成杨辉三角那种形状
       count += i;
    }
    cout << i << endl;
    return 0;
}
发表于 2019-08-01 09:09:41 回复(0)
"""
有规律的序列问题
"""
import sys
import math

if __name__ == "__main__":
    # sys.stdin = open("input.txt", "r")
    n = int(input().strip())
    t = int(math.sqrt(2 * n))
    while t * (t + 1) >> 1 < n:
        t += 1
    print(t)

发表于 2019-07-10 13:24:03 回复(0)

n = int(input())
i=0
while n>0:
    i=i+1
    n=n-i
print(i)

发表于 2019-09-21 21:02:03 回复(0)
#include <bits/stdc++.h>

using namespace std;

int main(){
  long long k;
  cin >> k;
  long long l = 1, r = 1000000, res = r;
  while(l <= r){
    long long mid = (l + r) >> 1;
    if((mid * (mid + 1)) / 2 >= k){
      r = mid - 1;
      res = min(res, mid);
    } else {
      l = mid + 1;
    }
  }
  cout << res << "\n";
  return 0;
}

发表于 2019-09-09 12:26:04 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;
    while(cin>>n){
        n--;
        double a=1,b=-1,c=-2*n;
        cout<<floor((-b+sqrt(b*b-4*a*c))/(2*a))<<endl;
    }
    return 0;
}

发表于 2019-09-01 16:06:45 回复(0)

从1-n的个数就是(n+1)*n/2个,相当于解一元二次方程,最后求大于等于正数解的正数(相当于上界)。
公式法解一元二次方程。

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            //(n+1)*n/2
            System.out.println((int)Math.ceil((-1 + Math.sqrt(1 + 8 * n)) / 2));
        }
    }
}
发表于 2019-08-29 13:58:12 回复(0)
'''
考虑斐波那契数列
第n个数,就是不大于n的斐波那契数列和的后一个数'''

import sys
if __name__=='__main__':
    n = int(input())
    i = 1
    res = 0
    while res < n:
        res += i
        i +=1
    print(i-1)

发表于 2019-08-09 21:21:37 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(bf.readLine());
        //dp[i]表示数字为i一共有多少个数字
        int[] dp = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            dp[i] = dp[i - 1] + i;
            if (dp[i] >= n) {
                System.out.println(i);
                return;
            }
        }
    }
}
发表于 2019-08-05 19:13:33 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 1; ; i++) {
            if (n <= i * (i + 1) / 2) {
                System.out.println(i);
                break;
            }
        }
    }
}
发表于 2019-07-02 15:18:03 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int n,i=1;
    cin>>n;
    while((n -= i ++) > 0);
    cout<<i-1<<endl;
    return 0;
}

发表于 2019-07-02 10:56:56 回复(0)
#include <stdio.h>
int main(){
    int n,i=0;
    scanf("%d",&n);
    while(n>((i+1)*i)/2)
        i++;
    printf("%d\n",i);
    return 0;
}

发表于 2018-11-18 12:18:23 回复(0)
够短吗?

#include <stdio.h>
int main(void){
    int n, i = 1;
    scanf("%d", &n);
    while( (n -= i ++) > 0 );
    printf("%d",i-1);
    return 0;
}

编辑于 2018-11-14 20:07:45 回复(0)

import java.util.;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n = sc.nextInt();
int key=(int) Math.sqrt(n);
int i=0;
for (i = key;i
(i+1)<2*n ; i++);
System.out.print(i);
}
}

发表于 2019-07-06 16:25:49 回复(0)
用等差数列和公式将每个数字的结束下标存储在一个数组中然后遍历即可
#include<stdio.h>

#define LEN 10000

int main()
{
    long long end[LEN];
    for(int i = 1;i < LEN;++i){
        end[i] = i * ( 1 + i) / 2 ;
    }
    long long n;
    scanf("%lld",&n);
    for(int i = 1;i < LEN;++i){
        if(n <= end[i]){
            printf("%d",i);
            break;
        }
    }
    return 0;
}


发表于 2019-10-03 22:39:18 回复(0)
import java.util.Scanner;
//来自一个老实人的代码
public class Main {
    public static  void  main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int number = 1;
        int i = 0;

        if(n==1){
            System.out.println(1);
            return;
        }
        
        while(n>number){    
            number=i+number;
            i++;             
        }
        if(n == number){
            System.out.println(i);
        }else if(number>n){
            System.out.println(i-1);
        }
    }
}

发表于 2019-10-03 16:22:04 回复(0)
我觉得这类题上来就想到二分查找才能起到锻炼的作用- -
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), left = 1, right = n;
        while (left <= right){
            int mid = (left + right) / 2;
            if ((mid + 1) * mid / 2 < n) left = mid + 1;
            else right = mid - 1;
        }
        System.out.println(left);
    }
}


发表于 2019-09-24 13:44:49 回复(0)
比较n的值大于一个等差数列的前k项和时,输出k的值



import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int i = 1;
        int sum = 0;
        while(true){
            if(sum >= n){
                System.out.println(i-1);
                return;
            }
            sum += i;
            i++;
        }
    }
}

发表于 2019-09-16 19:41:06 回复(0)
num = int(input())
s=1
while s:
    h1 =s*(s+1)/2
    if num-h1>0:
        s += 1
    else:
        print(s)
        break
从1开始取每组末尾搜就完事了。
或者更加简单粗暴的
import math
num  = int(input())
print(math.ceil((math.sqrt(1+8*num)-1)/2))



编辑于 2019-09-16 13:28:30 回复(0)