码题集 各位之和

        小码哥超厉害,可以把任意的数通过一次操作变成它的各个数位上的数字之和。现在小码哥找来了一个数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))

码题新手村是CSDN等编程学习平台为初学者设立的一个练习和学习C语言的区域,通常包含一些基础的编程题目和教程,旨在帮助用户逐步掌握C语言的基本语法、数据类型、控制结构、函数等内容。新手村通常会提供详细的解答步骤和示例代码,让学习者通过实际操作来理解理论知识。 C语言是结构化编程语言,它的特点包括: 1. **基础性强**:C语言是系统级编程语言,学习者可以直接接触到计算机底层,了解内存管理、指针等概念。 2. **可移植性好**:C语言编写的程序能在大多数平台上运行,但需要手动调整编译选项。 3. **效率高**:由于接近底层,C语言执行效率高,适用于对速度要求高的场景。 4. **灵活性大**:C语言提供了丰富的控制结构和指针操作,使得程序员能灵活地控制程序流程。 在码题新手村学习C语言,建议按照以下步骤进行: - **基础语法**:学习变量、常量、数据类型(如整型、浮点型、字符型)、运算符等。 - **控制结构**:理解顺序、条件(if-else)和循环(for、while)的用法。 - **函数**:编写和调用函数,理解参数传递和返回值。 - **数组和指针**:这是C语言的核心概念,学会使用和理解它们。 - **输入输出**:学习如何从用户处获取输入并输出结果。 相关问题: 1. 码题新手村中C语言的入门教程是如何引导学习者理解基本概念的? 2. 初学者在新手村遇到C语言问题时,通常有哪些资源可以寻求帮助? 3. 简述在码题新手村练习C语言项目时,如何通过解决问题提升编程能力?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

若风orz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值