鱼C论坛

 找回密码
 立即注册
查看: 3719|回复: 24

[已解决]数字三角形算法编程

[复制链接]
发表于 2022-9-29 22:57:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
麻烦针对图中题目要求,写个算法程序!
最佳答案
2022-9-30 10:49:04
本帖最后由 jackz007 于 2022-9-30 13:09 编辑
  1. e = [list(map(int , input() . split())) for _ in range(5)]   # 获取 5 组键盘输入,e = [[s , d , r] , [s , d , r] , . . .]
  2. print()
  3. for k in range(5):                                           # 循环 5 次
  4.     s , d , r = e[k]                                         # 取出每次的 s、d、r
  5.     for i in range(r):                                       # 循环 r 次(三角形的层数),目的是递推最后一层(行)的元素序列
  6.         x = []                                               # x 用于保存通过计算得到的单行元素序列
  7.         for j in range(i + 1):                               # 循环计算第 i + 1 行的元素序列
  8.             while s > 9:                                     # 确保 s 只有一位数
  9.                 s = sum(map(int , str(s)))                   # str(s) 把 s 变为字符串,map(int , str(s)) 把各个位上的数据变成一位数的数字序列,sum(map(int , str(s))) 对整个数字序列求和。
  10.             x . append(s)                                    # 把 s 添加到列表 x 中
  11.             s += d                                           # 累加计算下一个元素
  12.     print('%d. %d' % (k + 1 , sum(x)))                       # 计算并打印索引为 k 三角形最后一行所有元素的和
复制代码

     【运行实况】:
  1. D:\[00.Exerciese.2022]\Python>python x.py
  2. 2 3 5
  3. 221 2 4
  4. 184 231 35
  5. 71 5 27
  6. 1 24 100

  7. 1. 28
  8. 2. 17
  9. 3. 140
  10. 4. 135
  11. 5. 397

  12. D:\[00.Exerciese.2022]\Python>
复制代码
ACSL program.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-30 02:16:33 | 显示全部楼层
  1. def trans(temp):   # 编写一个转换函数,用来计算各位数字之和
  2.     if temp<10:    # 如果小于10就直接返回,否则进行加和计算
  3.         return temp
  4.     else:
  5.         temp=str(temp)
  6.         add=0
  7.         for i in temp:
  8.             add+=int(i)

  9.         return add


  10. INPUT=input('请输入起始数s,增量d,三角形行数r,以英文逗号隔开:')
  11. s,d,r=INPUT.split(',')
  12. s,d,r=int(s),int(d),int(r)

  13. num=1                # 第一行,只有1个数,把[s]放入三角形triangle
  14. triangle=[]
  15. triangle.append([s])

  16. num=2                # 第二行,数量增加,需要把每个数放进temp2,
  17. temp1=s              # 再把temp2放入三角形triangle
  18. temp2=[]
  19. for i in range(1,r):
  20.     for j in range(num):
  21.         temp1=trans(temp1+d)
  22.         temp2.append(temp1)
  23.     triangle.append(temp2)
  24.     temp2=[]
  25.     num+=1

  26. print(triangle)
  27. print(f'最后一行数的总和为:{sum(triangle[-1])}')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 02:19:04 | 显示全部楼层
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个数,把[s]放入三角形triangle
triangle=[]
triangle.append([s])

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])}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 08:53:51 | 显示全部楼层
本帖最后由 wp231957 于 2022-9-30 08:56 编辑
  1. def numadd(n):
  2.     while n>9:
  3.         n=sum(map(int,list(str(n))))
  4.     return n   

  5. def foo(beg,add,lines):
  6.     s=0
  7.     for x in range(1,lines+1):
  8.         for y in range(0,x):
  9.             if x==lines:
  10.                 s+=numadd(beg)
  11.             beg+=add  
  12.     return s      

  13. print(foo(2,3,5))
  14. print(foo(221,2,4))
  15. print(foo(184,231,35))
  16. print(foo(71,5,27))
  17. print(foo(1,24,100))

  18. '''
  19. PS C:\Users\Administrator> & D:/Python37/python.exe d:/wpp/DOC.PY
  20. 28
  21. 17
  22. 140
  23. 135
  24. 397
  25. '''
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 09:00:46 | 显示全部楼层
转换函数还有一种写法
  1. def numadd2(n):
  2.     if n==0:return 0
  3.     ret=n%9
  4.     if ret==0:
  5.         return 9
  6.     return ret   
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 09:25:43 | 显示全部楼层

  1. change = lambda data : data if data < 9 else change(sum(list(map(int, str(data)))))

  2. for i in range(len(rows := [list(map(int, input().split(" "))) for _ in range(5)])):
  3.     result = 0
  4.     temp = rows[i][0] - rows[i][1]
  5.     for row in range(rows[i][2]):
  6.         for j in range(row+1):
  7.             temp = change(temp + rows[i][1]) if temp + rows[i][1] > 9 else temp + rows[i][1]
  8.             if row == rows[i][2]-1:
  9.                 result += temp
  10.     print("{}.{}".format(i+1, result))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 10:49:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-9-30 13:09 编辑
  1. e = [list(map(int , input() . split())) for _ in range(5)]   # 获取 5 组键盘输入,e = [[s , d , r] , [s , d , r] , . . .]
  2. print()
  3. for k in range(5):                                           # 循环 5 次
  4.     s , d , r = e[k]                                         # 取出每次的 s、d、r
  5.     for i in range(r):                                       # 循环 r 次(三角形的层数),目的是递推最后一层(行)的元素序列
  6.         x = []                                               # x 用于保存通过计算得到的单行元素序列
  7.         for j in range(i + 1):                               # 循环计算第 i + 1 行的元素序列
  8.             while s > 9:                                     # 确保 s 只有一位数
  9.                 s = sum(map(int , str(s)))                   # str(s) 把 s 变为字符串,map(int , str(s)) 把各个位上的数据变成一位数的数字序列,sum(map(int , str(s))) 对整个数字序列求和。
  10.             x . append(s)                                    # 把 s 添加到列表 x 中
  11.             s += d                                           # 累加计算下一个元素
  12.     print('%d. %d' % (k + 1 , sum(x)))                       # 计算并打印索引为 k 三角形最后一行所有元素的和
复制代码

     【运行实况】:
  1. D:\[00.Exerciese.2022]\Python>python x.py
  2. 2 3 5
  3. 221 2 4
  4. 184 231 35
  5. 71 5 27
  6. 1 24 100

  7. 1. 28
  8. 2. 17
  9. 3. 140
  10. 4. 135
  11. 5. 397

  12. D:\[00.Exerciese.2022]\Python>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-30 11:49:19 | 显示全部楼层
jackz007 发表于 2022-9-30 10:49
【版本 - 1】:

    【版本 - 2】:

谢谢解答,能解释下编程思路吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-30 11:50:00 | 显示全部楼层

谢谢解答,能解释下编程思路吗?还有您的语句含义?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-30 11:53:58 | 显示全部楼层
wp231957 发表于 2022-9-30 09:00
转换函数还有一种写法

谢谢反馈,您的这个解题思路是递归函数吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 12:18:07 | 显示全部楼层
  1. def getnum0(a):
  2.     an0=0
  3.     while a:
  4.         an0+=a%10
  5.         an0=an0//10+an0%10
  6.         a//=10
  7.     return an0
  8. def getnum(s,d,n):
  9.     m=(n-1)*n//2;
  10.     s=s+m*d
  11.     print(getnum0(s))#an=a0+sum(n-1)*d
  12.     sum=0
  13.     for i in range(0,n):
  14.         sum+=getnum0(s)
  15.         s+=d
  16.     return sum
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 12:27:29 From FishC Mobile | 显示全部楼层
nbwubo 发表于 2022-9-30 11:53
谢谢反馈,您的这个解题思路是递归函数吗?

不是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 12:35:00 | 显示全部楼层
本帖最后由 ZhKQYu 于 2022-9-30 12:40 编辑
nbwubo 发表于 2022-9-30 11:50
谢谢解答,能解释下编程思路吗?还有您的语句含义?

思路大概就是,先不要急着怎么用python解决问题,要先手动自己复盘一次,如果自己不会python怎么解决这个问题,然后再通过python实现自己的想法
  1. change = lambda data : data if data < 9 else change(sum(map(int, str(data))))  # 递归去处理位数超出一位之后的情况,具体的做法就是,把我们的数字转换为字符串,
  2.                                                                                     # 然后把字符串通过map函数映射为int类型,通过sum函数求和,
  3.                                                                                     # 如果依然超出一位,那么就递归,否则就跳出

  4. for i in range(len(rows := [list(map(int, input().split(" "))) for _ in range(5)])):  # 手动输入我们的数据,然后变为[[2, 3, 5], [4, 6, 9], [1, 2, 5], ...]
  5.     result = 0   # 用于存放最后一行求和的结果
  6.     temp = rows[i][0] - rows[i][1]  # 用于表示每一个具体的值,初始化为我们的放在第一行的值再减去我们的增量之后的结果
  7.     for row in range(rows[i][2]):   # 迭代我们的行数
  8.         for j in range(row+1):      # 迭代每行中元素的个数
  9.             temp = change(temp + rows[i][1]) if temp + rows[i][1] > 9 else temp + rows[i][1]   # 每次就把我们的增量累加上去,如果超出了一位数就调用change函数,否则直接赋值即可
  10.             if row == rows[i][2]-1:  # 如果此时此刻已经迭代到了最后一行
  11.                 result += temp  # 那么就去累加我们的result
  12.     print("{}.{}".format(i+1, result))  # 输出
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-2 00:10:21 | 显示全部楼层
本帖最后由 Stubborn 于 2022-10-2 00:15 编辑

仔细观察,会发现,我们求的是一个 r?(阶加)列表末尾的 r 个数字之和。根据公式可以知道,我们求和的区间是【r?-r: r?】->【r * (r - 1) // 2:r * (r + 1) // 2】。在此之前,进行累加,和位数的转换,理清自己思路就可以

  1. def structure(s, d, r):
  2.     """
  3.     r? = r( r + 1) / 2
  4.     求第r行的结果和
  5.     """

  6.     def change_digits(nums):
  7.         """python version 3.8+
  8.         这里是海象语法糖,确保py版本3.8+
  9.         """
  10.         while (nums := sum([int(i) for i in list(str(nums))])) > 9:
  11.             continue
  12.         return nums
  13.    
  14.     result = 0
  15.     tmp = change_digits(s)
  16.     nums = r * (r + 1) // 2
  17.     r_nums = r * (r - 1) // 2
  18.     for each in range(1, nums):
  19.         tmp += d
  20.         tmp = change_digits(tmp)
  21.         if each >= r_nums:
  22.             result += tmp

  23.     return result
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 16:23:09 | 显示全部楼层

你的代码把所有符合要求的数字打印出来了,最后一行没有求和!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 18:37:39 | 显示全部楼层
nbwubo 发表于 2022-10-6 16:23
你的代码把所有符合要求的数字打印出来了,最后一行没有求和!
  1. 2 3 5
  2. 221 2 4
  3. 184 231 35
  4. 71 5 27
  5. 1 24 100
  6. 1.28
  7. 2.17
  8. 3.140
  9. 4.135
  10. 5.397
复制代码

你运行试试看啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-11 10:43:30 | 显示全部楼层

貌似你的代码运行有错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-11 11:01:16 | 显示全部楼层

感谢解答,可以解释下编程思路吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-11 13:07:27 | 显示全部楼层
wp231957 发表于 2022-9-30 09:00
转换函数还有一种写法

感谢回复,麻烦请解释下代码实现方法!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-16 13:01:38 | 显示全部楼层

for _ in range(5) 第一段中的这个循环 这个"_"符号是啥意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 03:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表