鱼C论坛

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

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

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

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

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

x
麻烦针对图中题目要求,写个算法程序!
最佳答案
2022-9-30 10:49:04
本帖最后由 jackz007 于 2022-9-30 13:09 编辑
e = [list(map(int , input() . split())) for _ in range(5)]   # 获取 5 组键盘输入,e = [[s , d , r] , [s , d , r] , . . .]
print()
for k in range(5):                                           # 循环 5 次
    s , d , r = e[k]                                         # 取出每次的 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:\[00.Exerciese.2022]\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:\[00.Exerciese.2022]\Python>
ACSL program.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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个数,把[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 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 编辑
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
'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 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 := [list(map(int, input().split(" "))) for _ in range(5)])):
    result = 0
    temp = rows[i][0] - rows[i][1]
    for row in range(rows[i][2]):
        for j in range(row+1):
            temp = change(temp + rows[i][1]) if temp + rows[i][1] > 9 else temp + rows[i][1]
            if row == rows[i][2]-1:
                result += temp
    print("{}.{}".format(i+1, result))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 10:49:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-9-30 13:09 编辑
e = [list(map(int , input() . split())) for _ in range(5)]   # 获取 5 组键盘输入,e = [[s , d , r] , [s , d , r] , . . .]
print()
for k in range(5):                                           # 循环 5 次
    s , d , r = e[k]                                         # 取出每次的 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:\[00.Exerciese.2022]\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:\[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 | 显示全部楼层
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
想知道小甲鱼最近在做啥?请访问 -> 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实现自己的想法
change = lambda data : data if data < 9 else change(sum(map(int, str(data))))  # 递归去处理位数超出一位之后的情况,具体的做法就是,把我们的数字转换为字符串,
                                                                                    # 然后把字符串通过map函数映射为int类型,通过sum函数求和,
                                                                                    # 如果依然超出一位,那么就递归,否则就跳出

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

使用道具 举报

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

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

使用道具 举报

发表于 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
你运行试试看啊
想知道小甲鱼最近在做啥?请访问 -> 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-11-15 15:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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