Carryon 数数字
序号:#138 难度:困难 时间限制:1000ms 内存限制:80M
描述
Carryon 最近迷上了数数字,然后 Starry 给了他一个区间 [l,r] ,然后提了几个要求,
- 需要将 l 到 r 之间的数全部转化成 16 进制,然后连起来。
- 将连起来的数又转化成 10 进制。
- 将最终结果对 15 取模。
数据范围: 1 < = l < = r < = 1000000000000 1<=l<=r<=1000000000000 1<=l<=r<=1000000000000
输入
单组输入 l 和 r 的值
输出
输出最终结果。
输入样例
10 14
输出样例
0
小提示
如:10、11、12、13、14的16进制分别是a、b、c、d、e。依次连在一起是abcde,转换成10进制是703710,对15取模为0。
思路:
- 先看范围1~1e12 用普通for循环肯定超时,就要想怎么缩小范围,我们就先看取余
- 来看看为什么这里优化是 c = a + ( b − a ) % 15 c = a + (b - a)\%15 c=a+(b−a)%15
- 因为最后也要对15求余,我们就先对范围内取余来达到缩小范围这样也会保证结果相同以致不会超时
import sys
for line in sys.stdin:
line = line.strip()
a, b = map(int, line.split())
str = ""
res = ""
c = a + (b - a) % 15 # 先求个余 缩小范围
for i in range(a, c + 1):
str += hex(i) # 每次加每个数的16进制
str = str.replace('0x', '') # 替换0x无用字符
for i in range(a, b + 1):
ans = hex(i)
res += ans
res = res.replace('0x', '')
print("优化前:" + res)
print("优化后:" + str)
print(int(str, 16) % 15) # 再从16进制转10进制取余
看下结果
1 16
优化前:123456789abcdef10
优化后:1
1
1 99
优化前:123456789abcdef101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60616263
优化后:123456789
0
10 14
优化前:abcde
优化后:abcde
0
2 21
优化前:23456789abcdef101112131415
优化后:23456
5
import sys
for line in sys.stdin:
line = line.strip()
a,b= line.split()
str = ""
c = int(a) + (int(b)-int(a)) % 15 # 先求个余 缩小范围
for i in range(int(a), int(c)+1):
str += hex(i) # 每次加每个数的16进制
str = str.replace('0x', '') # 替换0x无用字符
print(int(str, 16) % 15) # 再从16进制转10进制取余