小爱有一个奇怪的计数器。在第一个时刻计数器显示数字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); } } }不太聪明的解法