nbwubo 发表于 2022-9-29 22:57:06

数字三角形算法编程

麻烦针对图中题目要求,写个算法程序!

lassiter 发表于 2022-9-30 02:16:33

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])}')

lassiter 发表于 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个数,把放入三角形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:53:51

本帖最后由 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
'''

wp231957 发表于 2022-9-30 09:00:46

转换函数还有一种写法
def numadd2(n):
    if n==0:return 0
    ret=n%9
    if ret==0:
      return 9
    return ret   

ZhKQYu 发表于 2022-9-30 09:25:43


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 10:49:04

本帖最后由 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>

nbwubo 发表于 2022-9-30 11:49:19

jackz007 发表于 2022-9-30 10:49
【版本 - 1】:

    【版本 - 2】:


谢谢解答,能解释下编程思路吗?

nbwubo 发表于 2022-9-30 11:50:00

ZhKQYu 发表于 2022-9-30 09:25


谢谢解答,能解释下编程思路吗?还有您的语句含义?

nbwubo 发表于 2022-9-30 11:53:58

wp231957 发表于 2022-9-30 09:00
转换函数还有一种写法

谢谢反馈,您的这个解题思路是递归函数吗?

jhq999 发表于 2022-9-30 12:18:07

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

wp231957 发表于 2022-9-30 12:27:29

nbwubo 发表于 2022-9-30 11:53
谢谢反馈,您的这个解题思路是递归函数吗?

不是的

ZhKQYu 发表于 2022-9-30 12:35:00

本帖最后由 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:10:21

本帖最后由 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

nbwubo 发表于 2022-10-6 16:23:09

ZhKQYu 发表于 2022-9-30 09:25


你的代码把所有符合要求的数字打印出来了,最后一行没有求和!

ZhKQYu 发表于 2022-10-6 18:37:39

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
你运行试试看啊

nbwubo 发表于 2022-10-11 10:43:30

jhq999 发表于 2022-9-30 12:18


貌似你的代码运行有错误

nbwubo 发表于 2022-10-11 11:01:16

ZhKQYu 发表于 2022-9-30 09:25


感谢解答,可以解释下编程思路吗?

nbwubo 发表于 2022-10-11 13:07:27

wp231957 发表于 2022-9-30 09:00
转换函数还有一种写法

感谢回复,麻烦请解释下代码实现方法!

nbwubo 发表于 2022-11-16 13:01:38

jackz007 发表于 2022-9-30 10:49
【运行实况】:

for _ in range(5) 第一段中的这个循环 这个"_"符号是啥意思?
页: [1] 2
查看完整版本: 数字三角形算法编程