刚开始肯定得看懂题目对吧。
所以:
实质上是求一个数n的哥哥数位上的数字的和。
例如有一个数字是
123456
123456
123456
那答案就是
1
+
2
+
3
+
4
+
5
+
6
=
21
1+2+3+4+5+6=21
1+2+3+4+5+6=21
既然是求各位数。
那肯定要把n拆开。
于是想到两种办法:
- 把n变成字符串str,再把每一个的字符转成int类型,用变量累加起来。
- 用取模和整除来得到n的各个数位
由于大家没有接触字符串的操作,所以这里用取模和整除来实现。
一
:
一:
一:
数字
123456
123456
123456取模(取模%就是取余数的意思)
10
10
10的时候,得到的是6,即个位数。
取模
100
100
100的时候,得到的是
56
56
56,即后两个数位,取模
1000
1000
1000的时候,得到的是456,即后三个数,以此类推。
二
:
二:
二:
数字
123456
123456
123456整除(整除
/
/
//
//就是取商舍去余数的意思)
10
10
10的时候,得到的是
12345
12345
12345,即前五个数。
整除
100
100
100的时候,得到的是
1234
1234
1234,即前四个数位,取模
1000
1000
1000的时候,得到的是
123
123
123,即前三个数,以此类推。
三
:
三:
三:
当你用取模运算取得了后n位,你就可以用整除运算取得第n位!!!
123456取模与整除
取模 10 10 10
得到 6 6 6
再整除 1 1 1结果: 6 6 6
取模 100 100 100
得到 56 56 56
且整除 10 10 10结果: 5 5 5
取模 1000 1000 1000
得到 456 456 456
且整除 100 100 100结果: 4 4 4
所以思路就很明朗了
Code:
n=int(input())
i=1
mod=10
#取模
sum=0
while i<=n:
sum=sum+(n%mod//i)
i=i*10
mod=mod*10
#每一次取完第n位,准备取第n+1位,把整除变量和取余变量都乘以10
print(sum)
当然还有更简单的思路
既然第一次取模
10
10
10求得的是第一位数字,那能不能把n的个位削掉呢(整体往右移)
即
123456
−
−
>
12345
123456-->12345
123456−−>12345,那只需要每次都取模
10
10
10就可以求得每一位的数字之和啦。
Code
n=int(input())
sum=0
while n>0:
sum=sum+(n%10)
n=n//10
#把个位数削掉
print(sum)
总结
时间复杂度
O
(
l
o
g
10
n
)
O(log_{10}{}{n})
O(log10n)
输入数字大概可以去到
1
⩽
n
⩽
1
0
100000
1leqslant n leqslant 10^{100000}
1⩽n⩽10100000不超时



