有一个无限长的数字序列1,2,2,3,3,3,4,4,4,4,5,5,5,5,5。。。(数字序列从1开始递增,且数字k在该序列中正好出现k次),求第n项是多少
数据范围:
import java.util.Scanner; /** * @Date: 2020-04-30 15:26 * @version: 1.0 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int l = 1;//最小是1 int r = n;//上界是n int mid ; while (l<=r){ mid=(l+r)>>1; if ((1+mid)*mid/2==n){ System.out.println(mid); sc.close(); System.exit(0); } if ((1+mid)*mid/2<n) l=mid+1; else r=mid-1; } System.out.println(l); sc.close(); } }
//如:输入为3,有序数列第3项的值为2,则输出为2 /* 等差求和公式1+2+3+4+5+6+7+8+9 有这个规律可知,当输入的n在i*(i+1)/2与(i+1)*(i+2)/2之间的时候,第n项的值就是i+1 最后我们进行了除2的优化,减少了循环次数 */ import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); int n = input.nextInt(); int flag = 0; for(int i = 0;i<= n/2;i++){ int min = i*(i+1); int max = (i+1)*(i+2); if(min < 2*n && max >=2*n){ flag = i+1;break; } } System.out.println(flag); } }
import java.util.Scanner; //import java.lang.Integer.MAX_VALUE; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int x = sc.nextInt(); if(x == 1){ System.out.println(1); }else{ int ans = 0; int index = -1; for(int i = 1;i <= Integer.MAX_VALUE;i++){ ans += i; if(x >= ans && x <= (ans + i + 1)){ index = i + 1; break; } } System.out.println(index); } } }你们都好厉害,只有我这么笨的方法吗(大哭)
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); List<Integer> list = new ArrayList<>(); for(int i = 1; i <= n; i++){ int j = 0; while(j < i){ list.add(i); j++; } } System.out.println(list.get(n-1)); } }