首页 > 试题广场 >

计数器

[编程题]计数器
  • 热度指数:3777 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

小爱有一个奇怪的计数器。在第一个时刻计数器显示数字3,在接下来的每一个时刻,屏幕上的数字都会减1,直到减到1为止。

接下来,计数器会重置为上一个计数周期初始值的两倍,然后再每一个时刻减1。具体过程如下图所示:

找出规律,并打印出t时刻计数器的值。

输入描述:
输入为时刻t,一个整形数字。0<t<1e12


输出描述:
计数器显示的值。
示例1

输入

4

输出

6
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        int temp = 3;
        int count = 3;
        int index = 0;
        int head = 0;
        if(t <= count){
            if(t == 1){
                System.out.println(3);
            }else if(t == 2){
                System.out.println(2);
            }else{
                System.out.println(1);
            }
        }else{
            while(true){
            if(t <= (count+2*temp)){
                index = t - count;
                head = count + 1;
                break;
            }else{
                temp = 2*temp;
                count = count + temp;
            }
        }
          System.out.println(count+4-index);
        }
    }
}
一直提示请检查数组越界或非法访问,找不出问题啊
发表于 2020-04-08 13:21:21 回复(0)

可以看到每一组time和value相加的和是一样的,4、10、22、48...,且这些之间的差依次为6、12、24...规律就出来了。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        long t = Long.parseLong(br.readLine());
        long sum = 4L, n = 6L;
        while (t >= sum) {
            sum += n;
            n *= 2;
        }
        System.out.println(sum - t);
    }
}
编辑于 2019-07-31 16:46:17 回复(0)