Skip to content

18224: 找魔数

bute force/tow pointers, http://cs101.openjudge.cn/practice/18224

一个数如果能表示为两个完全平方数的和(两个正整数的平方和,如:2^2^+4^2^=20, 1^2^+4^2^=17),则称为魔数。要求你在一堆数字中找出魔数,并且分别以二进制、八进制、十六进制输出这个数字。

输入

第一行1个整数,代表m个数字(1 ≤ m ≤ 100) 接下来1行,为m个整数, X~i~ (1 ≤ X~i~ ≤ 1000)。

输出

每个魔数1行,以空格间隔输出该魔数的二进制、八进制、十六进制 (注:如果出现abcdef等字母,都按小写输出)

样例输入

4
3 9 20 17

样例输出

0b10100 0o24 0x14
0b10001 0o21 0x11

提示: python有函数bin, oct, hex

来源: cs101-2018

练习不同进制的输出,print(bin(num), oct(num), hex(num))

python
l = []
i = 1
while i*i < 1000:
	l.append(i*i)
	i += 1

magics = []
for i in l:
	for j in l:
		magics.append(i+j)


m = int(input())
x = [int(i) for i in input().split()]

for num in x:
	if num in magics:
		print(bin(num), oct(num), hex(num))
python
m=int(input())
s=[int(x) for x in input().split()]
for i in range(m):
    x=s[i]
    a=1
    ok=False
    while (a*a)<=x:
        for b in range(1,a+1):
            if a*a+b*b==x:
                print('{0:#b} {0:#o} {0:#x}'.format(x))
                ok=True
                break
        if ok:
            break
        a+=1

2020fall-cs101,颜蓓琪

这题在模拟考试的时候想到了能用双指针的做法,但是不太熟练双指针,所以上网搜了参考。

python
# tow pointers
n=int(input())
seq=[int(x) for x in input().split()]
for i in seq:
    left,right=1,int(i**0.5)+1
    while left<=right:
        if left**2+right**2==i:
            print(str(bin(i))+' '+str(oct(i))+' '+str(hex(i)))
            break
        elif left**2+right**2>i:
            right-=1
        elif left**2+right**2<i:
            left+=1