码题集 各位之和

        小码哥超厉害,可以把任意的数通过一次操作变成它的各个数位上的数字之和。现在小码哥找来了一个数n,请问操作几次之后可以变成一个一位数。

 思路:

        其实这题思路很显然,就是对输入的数反复按照题目要求操作,直到这个数变为一个一位数,然后输出对这个数操作的次数。这里说的一次操作就是指把一个数变成它各个数位上的数字之和。难点在于,对数的每次操作怎么才能效率更快,输入的整数数量级是非常大的,一定要采取合理的操作方式,不然会超时。下面对比两种操作的方式。

方法一:

n = int(input()) # 输入数据
num_list = [] # 保存输入数据每个数位数字的列表
while True:
    if n != 0:
        num_list.append(n % 10) 
        n //= 10
    else:
        break
n = sum(num.list) # 计算各个数位上数字的和,并取代n原本的值

        这种方法是最容易想到的,也是可行的,依次提取数据每个数位上的数字,再保存进列表,最后计算列表内所有数字的和。但是对于本题来说,输入的数据数量级太大了,100000的数量级就说明得循环计算100000次才能提取出全部数字,效率太低且一定会超时!

方法二:

# 输入数据,但是字符串,没有转化成整数
n_str = input() 

# num_list保存输入数据每个数位数字的列表
num_list = list(map(int, num_str)) 

# 通过num_list计算数据各个数位的和
# 并且把计算结果转换成字符串,为下一次操作做准备
num_str = str(sum(num_list))

        第二种方法的效率会比上一种高效很多,区别在于:第一种方法是通过整数取余数的方法一个一个的提取各个数位上的数字,需要循环非常多次复杂度高;第二种方法各个数位上的数字是通过字符ascii码的映射直接转化的,不需要计算且效率极高。所以本题的每次操作应该通过方法二实现。

本题代码如下:

num_str = input() # 输入字符串型的整数数据
count = 0 # 保存对数的操作次数

# 每次循环对数进行一次操作,直到数变成1位数
while True:
    if len(num_str) == 1: # 字符串长度为1,停止循环,输出count
        print(count)
        break
    else: 
        count += 1 
    num_list = list(map(int, num_str))
    num_str = str(sum(num_list))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若风orz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值