数字54321,打印位数,比如打万位,5位
//整除
余数 4321%1000= 4321/1000 ,商数是4,余数是321
**10000每次整除10可以
也可以定义次方的变量n
如果你不测试优先级的问题,就需要先套个括号保险一点
还是写成这样好看点
想要知道循环出现问题的话,可以用break,第一次就退出,整个循环就结束了
想要知道哪一层出现问题可以定义一个i==0,第一次等于0就退出
第二次=1出现问题,就退出,就告诉你是在第二层
**常用的可以打印一层~~~~~~,也可以看出哪一层出了问题
告诉你每一次得到的结果也可以加x看一下次数,有些可能漏掉了迭代的次数
思路
先考虑一趟做什么事情
如果严格按照个位开始打
拿到用户输入,强制转换成整型
如果是00543,int会直接转换成543
折半查找是几位数
如果写成6就会报异常,除0了
改成10的n次方即可
n代表几位数
只不过前面都是0
0是假,非0是真,所以就可以加判断
结果
注释掉,其实是空炮了三次
但是如果是00500,该如何呢,现在还是打印不出0
当你从万位开始,第一个开始,非0往后都是有效的,前面都是无效的
比如00500,前面两个0是无效的,后面5开始都是有效的
做一个标记位,假定还没有碰到第一个非0,为false,碰到非0就改成true,表示这个开关标志打开
但是上面这样,后面的500的00 就进不去循环了,就需要修改条件
第一次进去
flag =false 代表0 and(and作为乘法,0乘任何数没有必要乘,false就不能改变) 这样写and就不合适
**改成这样,先把flag取反,再看y
第一次进来 flag=flase y=x//w 500 //10 * *(6-1) = -00500 第一个位数是0 =0
not flase 表示true =1 (1乘以任何数=任何数) y=0 第一次false
第二次 00500 第二位是0
还是0 就还是false
第三次 00500 ,到达5 ,y=5,not flage=not false=true
可以进入循环,打印5 ,flag变成了 true
**到了第四次, flag=true
not flag =false,false就不能and了 ,所以在这样写是不对的
把not去掉成不成
第一次进来 flage =false, or(当做+法) ,y=0 0+0还是等于0,进不去
第二次 也是一样 flag=false ,y=0
第三次 falg =false y=5 进去 ,flag=true
第4次 true or true=1 or=+ 1加任何数都是true,就直接可以了
走一把看看这样0就不是什么大问题了
推理过程
把问题先抽象成小问题,再解决大规模,把核心部分提取出来,变成小问题
这种方法是把值-商数,剩下的就是位数
divmod
div除法,mode取余
连除带取模
解决问题有很多种方法
54001测试了,你再测试看看00451,,01230
依然使用flag标记,
01230进来以后,
第一次 w =10000 ,flag =false length=5
t=c//w 01230//10000=0 第一位是0
if flag =false 进不来
跳转到 else
if t t是0,不能进去,跳转到else
length-1 =5-1=4,告诉你不是5位数,但是,是不是4位数不确定,看下一次判断
c=c%w=0
w=10000/10=1000
到达第二次,w=1000,length=4,,flag =false
t=c//w 01230//1000=0 第一位是1
if flag =false 进不来
跳转到 else
if t =1 就进来了,找到第一个位数
else的length就不要-1了 ,固定成4
00451进来以后,
第一次 w =10000 ,flag =false length=5
t=c//w 00451//10000=0 第一位是0
if flag =false 进不来
跳转到 else
if t t是0,不能进去,跳转到else
length-1 =5-1=4,告诉你不是5位数,但是,是不是4位数不确定,看下一次判断
c=c%w=0
w=10000/10=1000
到达第二次,w=1000,length=4,,flag =false
t=c//w 00451//1000=0 第二位是0
if flag =false 进不来
跳转到 else
if t t是0,不能进去,跳转到else
length-1 =4-1=3,告诉你不是4位数,但是,是不是3位数不确定,看下一次判断
c=c%w=0
w=1000/10=100
到达第三次
w=100,length=3,,flag =false
t=c//w 00451//100=0 第三位是4
if flag =false 进不来
跳转到 else
if t =4 就进来了,找到第一个位数
else的length就不要-1了 ,固定成3
**break,代表打破,不正常结束,else就不会执行
**
如果可迭代对象是空的,比如range(0)(前开后不开,前包后不包),也叫循环正常结束
break打破循环,不正常结束,else就不执行
continue是会正常执行的