蓝桥杯 特别数的和 奇数倍数 乘积尾零 python组

题目描述        特别数的和

小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

请问,在 1 到 n 中,所有这样的数的和是多少?

输入描述

输入格式:

输入一行包含两个整数n(1≤n≤10**4)。

输出描述

输出一行,包含一个整数,表示满足条件的数的和。

解答:

因为这道题是填空题,所以不用使用各种复杂的方法来解决问题,因为一般情况下,代码越复杂,错误就会越多。直接用最简单的方法算出结果即可,这道题用暴力法解决最为方便。

n = int(input())

ans = 0

for i in range(1,n+1):        #这里总共循环1到n个数

  an = str(i)

  if '2' in an or '0' in an or '1' in an or '9' in an:        #符合条件就加一

    ans += i

print(ans)

---------------------------------------------------------------------------------------------------------------------------------------------

题目描述        奇数倍数

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

请你找到最小的整数 X 同时满足:

  1. X 是 2019 的整倍数;
  2. X 的每一位数字都是奇数。

解答:

直接算2019从倍数为1开始往后增加,直到找到第一个符合题目条件的值,输出即可结束循环。

def check():

  for i in range(100):

    ans = str(i*2019)

    for j in ans:

      if int(j)%2==0:

        break

    else:

      print(ans)

check()        #可以用函数方式来处理,也可以直接写for循环,在for循环中插个旗子,输出第一个值以后把旗子插上,作为判定条件结束循环即可。

 ---------------------------------------------------------------------------------------------------------------------------------------

题目描述        乘积尾零

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如下的 10 行数据,每行有 10 个整数,请你求出它们的乘积的末尾有多少个零?

5650 4542 3554 473 946 4114 3871 9073 90 4329 
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 
1486 5722 3135 1170 4014 5510 5120 729 2880 9019 
2049 698 4582 4346 4427 646 9742 7340 1230 7683 
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 
6701 6645 1671 5978 2704 9926 295 3125 3878 6785 
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 
689 5510 8243 6114 337 4096 8199 7313 3685 211 

解答:

python是对大数可以直接运算的,理论上python是可以无限大的,但实际上受运行时的内存大小影响,但对于这100个数的乘积,是完全可以运算出来的。所以说直接算即可,然后将结果转换为字符串,倒叙开始记录末尾的0的个数。输出即可。而对于C和JAVA的话,long long 类型也是可以的。

但如果还是超的话,可以把每次运算的数进行一次“剪枝”,也就是把每次运算的结果只保留到末尾0的前面一到两位数值即可(按情况来判断,即自己在代码处debug,看看末尾0的前面保留几位数值的结果是否一样),这种方法可以处理更多的数值,但像这道题来说,我写的代码就可以处理了,没必要写这么复杂。

ans = '''

5650 4542 3554 473 946 4114 3871 9073 90 4329 

2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 

9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 

1486 5722 3135 1170 4014 5510 5120 729 2880 9019 

2049 698 4582 4346 4427 646 9742 7340 1230 7683 

5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 

6701 6645 1671 5978 2704 9926 295 3125 3878 6785 

2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 

3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 

689 5510 8243 6114 337 4096 8199 7313 3685 211 

'''.replace('-','')

b = ans.split()

num = 1

for i in b:

          num *= int(i)        #把所有整数相乘

count = 0

for i in str(num)[::-1]:        #确定乘积的末尾有多少个0

          if i=='0':

                    count+=1

          else:

                    break

print(count)        #输出末尾的0的个数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

缱绻命运

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

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

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

打赏作者

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

抵扣说明:

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

余额充值