1.隔行变色
'''
思路:由题意每行的颜色为 蓝 白 交替
第21行到50行之间共有50-21+1=30行
'''
result=(50-21+1)/2
print(int(result))#15
2.立方尾不变
'''
思路:将符合立方尾不变的数字存入列表,最后统计列表中数字的个数
通过对数字立方后的运算结果 转化为字符串 再进行分段切片处理
因为是10000以内的数字,我们可以把它分为10、100、1000、10000
'''
data=[]
for i in range(1,10001):
if i<10:
if i==int(str(pow(i,3))[-1]):
data.append(i)
elif i<100:
if i==int(str(pow(i,3))[-2:]):
data.append(i)
elif i<1000:
if i==int(str(pow(i,3))[-3:]):
data.append(i)
elif i<10000:
if i==int(str(pow(i,3))[-4:]):
data.append(i)
print(len(data)) #36
3.煤球数量
'''
思路:
由题目可知道前4层数量分别为1 3 6 10
思路1:可以发现规律 本层数量=上一层数量+本层层数
思路2:每一层数量之间差值构成等差数列
'''
s,n=0,0 #s表示数量之和,n每层数量数
for i in range(1,101):
n+=i
s+=n
print(s) #171700
4.有奖竞猜
'''
思路:
猜谜结果已经知道
开始777个币,猜错扣555个币
根据结果不存在扣光情况
'''
result='vxvxvxvxvxvxvvx'
count=777 #初始币量
wrong=555#猜错扣除币量
for i in result:
if i=='v':#如果猜对
count*=2
else:#如果猜错
count-=wrong
print(count) #58497
5.平方怪圈
'''
思路:
正整数的每一位平方后再求和,得到的新整数继续这样操作。
直接进行暴力求解,当出现重复的数字的时候我们停止循环,我们将计算的数纳入列表并且将最后的数输出,我们就会看出那些在循环中,然后就可以直接看出最大
将每次计算的结果存入列表
再找出列表中最大值
'''
x = int(input())
result = []#将每次计算的结果存入列表
s = 0
while s not in result:
result.append(s)
s = 0
a = list(str(x))#将输入转化为字符串,便于每一位都平方后再求和
for i in range(len(a)):
s += int(a[i])**2
x = s
print(max(result)) #145
6.奇妙的数字
'''
思路:将平方和立方后的数字拼接成为字符串,再将字符串转化为列表,再将列表中数字转化为整型,对列表中数字排序后再将其转化为字符串列表
最后将处理好的字符串拼接好,如果结果和目标字符串一样就输出该数字
'''
for i in range(1,10000):
c=str(pow(i,2))+str(pow(i,3)) #将平方和立方后的数字拼接成为字符串
d=[int(i) for i in c]#将列表中数字转化为整型
l=[str(i) for i in sorted(d)]#列表中数字排序
if ''.join(l)=='0123456789':
print(i)#69
7.四平方和
'''
思路:
先找到单个数字平方后的边界(平方后小于n)
通过逐个循环,并且在第二次以后的每一层循环加入判断
'''
import math
n = int(input())
x = int((math.sqrt(n)))+1 #找到单个数字平方后的边界(平方后小于n)
ls = [pow(i,2) for i in range(0,x)]#用于确定d的存在
for a in range(x):
for b in range(a,x):
if a*a+b*b>n:#排除前2个元素平方和大于n情况
break
for c in range(b,x):
d=n-a*a-b*b-c*c
if d<0:#排除前3个元素平方和大于n情况
break
elif d in ls:
t=sorted([a,b,c,int(math.sqrt(d))])#对4个元素排序
print(' '.join([str(i) for i in t]))
exit()
8.移动距离
'''
思路:
将小区看作一个矩阵,小区序号按照S形状分布
通过分析,若将m坐标看作(x1,y1) n坐标看作(x2,y2),则m和n之间最短距离为|x1-x2|-|y1-y2|
'''
w, m, n = map(int,input().split(' '))#6 8 2
y = max(m,n)//w + 1 #找到矩阵中最大的行数
jz = []
res = []
for i in range(y):
temp = [j for j in range(w*i+1, w*(i+1)+1)]#按规则生成每行序列
if i%2 == 0:
jz.append(temp)
else:
temp = temp[::-1]
jz.append(temp)
if m in temp:#记录坐标
res.append([temp.index(m)+1,i+1])
if n in temp:#记录坐标
res.append([temp.index(n)+1,i+1])
# print(jz)
print(abs(res[0][1]-res[1][1]) + abs(res[0][0]-res[1][0]))
9.冰雹数
'''
思路:
判断输入数字的奇偶,分别执行不同的运算方法,并且将每次运算的结果写入列表,当运算的数字等于一以后,循环停止
将每个数字运算结果生成一个列表,再将每个数字生成的列表添加到result=[],通过循环result=[]找出最大的值,再将值存入max_result=[]
最后print(max(max_result))即可。
'''
nums=int(input())
result=[]
max_result=[]
for num in range(1,nums+1):#遍历不大于N的每个数字
inner=[]
inner.append(num)
while num!=1:
if num%2==0:
num/=2
inner.append(int(num))
else:
num=num*3+1
inner.append(int(num))
result.append(inner)
for res in result:
max_result.append(max(res))
print(max(max_result))
10.打印大X
'''
思路:观察发现每行符号个数x=m+n-1,总共行数y=n
构造出一个输入m n大小的矩阵
通过循环画出x上半部分(包括中间),再画出x下半部分,最后拼接矩阵
'''
m,n=map(int,input().split())
jz=[['.' for i in range(m+n-1)] for j in range(n)]#构造出一个输入m n大小的矩阵
for x in range(int((n+1)/2)):#画出x上半部分(包括中间)
for y in range(m):
jz[x][x+y]='*'
for y in range(-m-x,-x):
jz[x][y] = '*'
for x in range(int((n+1)/2),n):#画出x下半部分
jz[x]=jz[n-x-1]
for i in jz:
print(''.join(i))