小爱有一个奇怪的计数器。在第一个时刻计数器显示数字3,在接下来的每一个时刻,屏幕上的数字都会减1,直到减到1为止。
接下来,计数器会重置为上一个计数周期初始值的两倍,然后再每一个时刻减1。具体过程如下图所示:
找出规律,并打印出t时刻计数器的值。
#include <iostream>
using namespace std;
int main(void){
//1e12大于int类型范围
long long t, time = 3;
cin>>t;
while(t > time){
t -= time;
time *= 2;
}
cout<<time+1-t<<endl;
return 0;
} 变量time表示当前周期的起始计数大小,分别是3,6,12,...,t减去相应的周期大小,当t不大于下一周期大小时,表示在当前周期显示,观察题目所给的表格,发现time+value为定值,为了表示方便,再把time减去上一周期的起始值,得到索引1,2,3,...这些索引值加上value之和等于本周期起始计数值加1//非迭代版本
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long time = scanner.nextLong();
long value = 3;
while(time - value > 0){
time -= (value);
value <<= 1;
}
value -= time - 1;
System.out.println(value);
}
}
可以看到每一组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);
}
}
t=input('');
x=3; a=3;
while 1
if t<3
fprintf('%d',4-t);
break
elseif t-a<2*x
fprintf('%d',2*x-(t-a)+1);
break
else
x=x*2; a=a+x;
end
end int main() {
long t = 0;
cin >> t; long start = 1;
while (start<=t)
{
start = (start *2 +2);
}
printf("%ld", start - t); return 0;
}
import math class MainActivity: def main(self): # Read the data t = int(input()) # Calculate the result k = math.log2(t / 3 + 1) if math.floor(k) == k: print(1) return k = math.floor(k) result = 3 * 2 ** k - (t - 3 * (2 ** k - 1)) + 1 print(result) if __name__ == '__main__': M = MainActivity() M.main()
#include<stdio.h>
#include<math.h>
int main()
{
long long time;
long long value;
long long time_init;
long long low;//hangshu 0kaishi
scanf("%ld",&time);
low=(int)(log((time+2)/3)/log(2));
time_init=3*pow(2,low)-2;
value=time_init+2-(time-time_init);
printf("%ld",value);
return 0;
}
t=int(input()) tik=0 base=3 while t>base: t=t-base tik+=1 base=2*base res=base-t+1 print(res)
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
long n = Long.parseLong(sc.nextLine());
long i = 0;
long cur = 0;
long nextcur = 0;
while(true){
cur = 1 * 3 * i + 1;
nextcur = 1 * 3 * (2*i+1)+1 ;
if(n<nextcur && n >=cur){
break;
}
i = 2*i + 1;
}
cur -= (n - cur -2);
System.out.println(cur);
}
}
} 不太聪明的解法