数字三角形算法编程
麻烦针对图中题目要求,写个算法程序! def trans(temp): # 编写一个转换函数,用来计算各位数字之和if temp<10: # 如果小于10就直接返回,否则进行加和计算
return temp
else:
temp=str(temp)
add=0
for i in temp:
add+=int(i)
return add
INPUT=input('请输入起始数s,增量d,三角形行数r,以英文逗号隔开:')
s,d,r=INPUT.split(',')
s,d,r=int(s),int(d),int(r)
num=1 # 第一行,只有1个数,把放入三角形triangle
triangle=[]
triangle.append()
num=2 # 第二行,数量增加,需要把每个数放进temp2,
temp1=s # 再把temp2放入三角形triangle
temp2=[]
for i in range(1,r):
for j in range(num):
temp1=trans(temp1+d)
temp2.append(temp1)
triangle.append(temp2)
temp2=[]
num+=1
print(triangle)
print(f'最后一行数的总和为:{sum(triangle[-1])}') def trans(temp): # 编写一个转换函数,用来计算各位数字之和
if temp<10: # 如果小于10就直接返回,否则进行加和计算
return temp
else:
temp=str(temp)
add=0
for i in temp:
add+=int(i)
return add
INPUT=input('请输入起始数s,增量d,三角形行数r,以英文逗号隔开:')
s,d,r=INPUT.split(',')
s,d,r=int(s),int(d),int(r)
num=1 # 第一行,只有1个数,把放入三角形triangle
triangle=[]
triangle.append()
num=2 # 第二行,数量增加,需要把每个数放进temp2,
temp1=s # 再把temp2放入三角形triangle
temp2=[]
for i in range(1,r):
for j in range(num):
temp1=trans(temp1+d)
temp2.append(temp1)
triangle.append(temp2)
temp2=[]
num+=1
print(triangle)
print(f'最后一行数的总和为:{sum(triangle[-1])}') 本帖最后由 wp231957 于 2022-9-30 08:56 编辑
def numadd(n):
while n>9:
n=sum(map(int,list(str(n))))
return n
def foo(beg,add,lines):
s=0
for x in range(1,lines+1):
for y in range(0,x):
if x==lines:
s+=numadd(beg)
beg+=add
return s
print(foo(2,3,5))
print(foo(221,2,4))
print(foo(184,231,35))
print(foo(71,5,27))
print(foo(1,24,100))
'''
PS C:\Users\Administrator> & D:/Python37/python.exe d:/wpp/DOC.PY
28
17
140
135
397
''' 转换函数还有一种写法
def numadd2(n):
if n==0:return 0
ret=n%9
if ret==0:
return 9
return ret
change = lambda data : data if data < 9 else change(sum(list(map(int, str(data)))))
for i in range(len(rows := )):
result = 0
temp = rows - rows
for row in range(rows):
for j in range(row+1):
temp = change(temp + rows) if temp + rows > 9 else temp + rows
if row == rows-1:
result += temp
print("{}.{}".format(i+1, result)) 本帖最后由 jackz007 于 2022-9-30 13:09 编辑
e = # 获取 5 组键盘输入,e = [ , , . . .]
print()
for k in range(5): # 循环 5 次
s , d , r = e # 取出每次的 s、d、r
for i in range(r): # 循环 r 次(三角形的层数),目的是递推最后一层(行)的元素序列
x = [] # x 用于保存通过计算得到的单行元素序列
for j in range(i + 1): # 循环计算第 i + 1 行的元素序列
while s > 9: # 确保 s 只有一位数
s = sum(map(int , str(s))) # str(s) 把 s 变为字符串,map(int , str(s)) 把各个位上的数据变成一位数的数字序列,sum(map(int , str(s))) 对整个数字序列求和。
x . append(s) # 把 s 添加到列表 x 中
s += d # 累加计算下一个元素
print('%d. %d' % (k + 1 , sum(x))) # 计算并打印索引为 k 三角形最后一行所有元素的和
【运行实况】:
D:\\Python>python x.py
2 3 5
221 2 4
184 231 35
71 5 27
1 24 100
1. 28
2. 17
3. 140
4. 135
5. 397
D:\\Python> jackz007 发表于 2022-9-30 10:49
【版本 - 1】:
【版本 - 2】:
谢谢解答,能解释下编程思路吗? ZhKQYu 发表于 2022-9-30 09:25
谢谢解答,能解释下编程思路吗?还有您的语句含义? wp231957 发表于 2022-9-30 09:00
转换函数还有一种写法
谢谢反馈,您的这个解题思路是递归函数吗? def getnum0(a):
an0=0
while a:
an0+=a%10
an0=an0//10+an0%10
a//=10
return an0
def getnum(s,d,n):
m=(n-1)*n//2;
s=s+m*d
print(getnum0(s))#an=a0+sum(n-1)*d
sum=0
for i in range(0,n):
sum+=getnum0(s)
s+=d
return sum nbwubo 发表于 2022-9-30 11:53
谢谢反馈,您的这个解题思路是递归函数吗?
不是的 本帖最后由 ZhKQYu 于 2022-9-30 12:40 编辑
nbwubo 发表于 2022-9-30 11:50
谢谢解答,能解释下编程思路吗?还有您的语句含义?
思路大概就是,先不要急着怎么用python解决问题,要先手动自己复盘一次,如果自己不会python怎么解决这个问题,然后再通过python实现自己的想法
change = lambda data : data if data < 9 else change(sum(map(int, str(data))))# 递归去处理位数超出一位之后的情况,具体的做法就是,把我们的数字转换为字符串,
# 然后把字符串通过map函数映射为int类型,通过sum函数求和,
# 如果依然超出一位,那么就递归,否则就跳出
for i in range(len(rows := )):# 手动输入我们的数据,然后变为[, , , ...]
result = 0 # 用于存放最后一行求和的结果
temp = rows - rows# 用于表示每一个具体的值,初始化为我们的放在第一行的值再减去我们的增量之后的结果
for row in range(rows): # 迭代我们的行数
for j in range(row+1): # 迭代每行中元素的个数
temp = change(temp + rows) if temp + rows > 9 else temp + rows # 每次就把我们的增量累加上去,如果超出了一位数就调用change函数,否则直接赋值即可
if row == rows-1:# 如果此时此刻已经迭代到了最后一行
result += temp# 那么就去累加我们的result
print("{}.{}".format(i+1, result))# 输出
本帖最后由 Stubborn 于 2022-10-2 00:15 编辑
仔细观察,会发现,我们求的是一个 r?(阶加)列表末尾的 r 个数字之和。根据公式可以知道,我们求和的区间是【r?-r: r?】->【r * (r - 1) // 2:r * (r + 1) // 2】。在此之前,进行累加,和位数的转换,理清自己思路就可以
def structure(s, d, r):
"""
r? = r( r + 1) / 2
求第r行的结果和
"""
def change_digits(nums):
"""python version 3.8+
这里是海象语法糖,确保py版本3.8+
"""
while (nums := sum()) > 9:
continue
return nums
result = 0
tmp = change_digits(s)
nums = r * (r + 1) // 2
r_nums = r * (r - 1) // 2
for each in range(1, nums):
tmp += d
tmp = change_digits(tmp)
if each >= r_nums:
result += tmp
return result
ZhKQYu 发表于 2022-9-30 09:25
你的代码把所有符合要求的数字打印出来了,最后一行没有求和! nbwubo 发表于 2022-10-6 16:23
你的代码把所有符合要求的数字打印出来了,最后一行没有求和!
2 3 5
221 2 4
184 231 35
71 5 27
1 24 100
1.28
2.17
3.140
4.135
5.397
你运行试试看啊 jhq999 发表于 2022-9-30 12:18
貌似你的代码运行有错误 ZhKQYu 发表于 2022-9-30 09:25
感谢解答,可以解释下编程思路吗?
wp231957 发表于 2022-9-30 09:00
转换函数还有一种写法
感谢回复,麻烦请解释下代码实现方法! jackz007 发表于 2022-9-30 10:49
【运行实况】:
for _ in range(5) 第一段中的这个循环 这个"_"符号是啥意思?
页:
[1]
2