鱼C论坛

 找回密码
 立即注册
查看: 8427|回复: 57

[技术交流] 小练习:20160224 找出1000以下自然数中3和5的倍数之和

[复制链接]
发表于 2016-2-24 08:58:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2016-3-2 11:17 编辑

从现在开始我们要开展一批欧拉计划的习题练习。
其实在我们论坛中已有欧拉计划的板块,可能有些鱼油还没注意到。
什么是欧拉计划:http://bbs.fishc.com/thread-60405-1-1.html
我们欧拉板块现已给出了81道题,这批练习将从欧拉计划中选题。其实用python语言完成有很多的优势,可以更简洁更方便的实现。
如果大家有兴趣也可浏览欧拉的英文网站:https://projecteuler.net/archives
这里已经有了500余题,并且你每做对一题,就可以下载到参考答案的pdf文件,看看你的实现方法与参考答案有什么不同,以利于迅速提高自己的水平。


                               
登录/注册后可看大图

好了言归正传,我们开始做小练习。


10 以下的自然数中,属于 3 和 5 的倍数的有 3, 5, 6 和 9,它们之和是 23

找出 1000 以下(不包括1000)的自然数中,属于 3 和 5 的倍数的数字之和



加赛题:
找出1000以下(不包括1000)自然数中不含7的倍数且每位数字中均不含7的数之和。
有鱼油问加赛题的含义:以10~30为例,包括10,11,12,13,15,16,18,19,20,22,23,24,25,26,29,30不包括14,17,21,27,28

题目要求:
以python语言完成,如果是python2请注明。
程序以代码文字格式发帖。
题目比较简单,注重程序效率和创意。
答题在3.2 10:00前完成,其后将公开大家的答案。

另程序和答案可以在网上搜到,希望大家独立完成。


奖励:
对所有完成程序并得出正确答案的将给予加分奖励,优秀的将额外加分。
在完成一批题目后,将根据每期的完成情况总评评出最佳,会有神秘大奖。



评分

参与人数 2荣誉 +6 鱼币 +6 贡献 +5 收起 理由
wangguohui + 1 + 1 支持楼主!
~风介~ + 5 + 5 + 5 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-24 10:36:51 | 显示全部楼层
本帖最后由 DingRan 于 2016-2-24 11:56 编辑

严重支持
  1. M = 1000
  2. s1 = 0
  3. for i in range(M):
  4.     if not i%3 or not i%5:
  5.         s1 += i
  6. print('第一题:\n%d 以下的自然数中,属于3和5的倍数的数字之和为: %d'%(M,s1))
  7. print('==================================================================')
  8. s2 = 0
  9. for i in range(M):
  10.     if i%7 and str(i).find('7') == -1:
  11.         s2 += i
  12. print('第二题:\n%d 以下自然数中不含7的倍数且每位数字中均不含7的数之和为: %d'%(M,s2))
复制代码

运行结果
  1. >>>
  2. 第一题:
  3. 1000 以下的自然数中,属于3和5的倍数的数字之和为: 233168
  4. ==================================================================
  5. 第二题:
  6. 1000 以下自然数中不含7的倍数且每位数字中均不含7的数之和为: 293309
  7. >>>
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 10:39:27 | 显示全部楼层
占个坑先
找出 1000 以下(不包括1000)的自然数中,属于 3 和 5 的倍数的数字之和:
per_3 = 0
per_5 = 0
for each in range(1000) :
    if each%3 == 0:
        per_3 += each
        continue
    if each%5 == 0:
        per_5 += each
result = per_3 + per_5
print(result,per_3,per_5)


找出1000以下(不包括1000)自然数中不含7的倍数且每位数字中均不含7的数之和:

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 11:32:20 | 显示全部楼层
本帖最后由 不爱穿内裤 于 2016-2-24 21:13 编辑
  1. def sum_num1(num):
  2.     total = 0
  3.     while num > 0:
  4.         num -= 1
  5.         if num%3 == 0 or num%5 == 0:
  6.             total += num
  7.     return total

  8. def sum_num2(num):
  9.     total = 0
  10.     for n in range(num):
  11.         if n % 7 != 0:
  12.             if str(7) not in str(n):
  13.                 total += n
  14.     return total
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 11:41:11 | 显示全部楼层
本帖最后由 Lnan95 于 2016-2-26 00:32 编辑

第一题:
  1. sum = 0
  2. for each in range(1000):
  3.     if not each%3 or not each%5:
  4.         sum += each
  5. print("合为:%d" % sum)
复制代码

第二题:
  1. sum = 0
  2. for each in range(1000):
  3.     if each%7 and "7" not in str(each):
  4.         sum += each
  5. print("合为:%d" % sum)
复制代码



再来一个更短的方法
第一题
  1. print("合为:%d" %sum(g for g in range(1000) if not g%3 or not g%5))
复制代码


第二题
  1. print("合为:%d" %sum(g for g in range(1000) if g%7 and "7" not in str(g)))
复制代码


能想到的最短的了。。。哈哈哈
  1. print("①",sum(g for g in range(1000) if not g%3 or not g%5),"②",sum(g for g in range(1000) if g%7 and "7" not in str(g)))
复制代码

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-2-24 11:50:54 | 显示全部楼层
本帖最后由 wei_Y 于 2016-2-25 12:33 编辑
  1. def f_sum(max=1000):

  2.     # return sum([i for i in range(max) if i%15==0])
  3.     return sum(filter(lambda x: x%15==0, range(max)))

  4. def s_sum(max=1000):

  5.     # return sum([i for i in range(1000) if i%7 !=0 and '7' not in str(i)])
  6.     return sum(filter(lambda x: x%7 != 0 and '7' not in str(x), range(max)))
复制代码


前排支持~。

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 14:19:21 | 显示全部楼层
不错的资源
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 17:56:46 | 显示全部楼层
本帖最后由 VVFock3r 于 2016-2-29 11:36 编辑

以下均基于Python 3
  1. In [1]: sum(list(filter(lambda x: x % 3 ==0 or x % 5 == 0, list(range(1,1000)))))
  2. Out[1]: 233168

  3. In [2]: sum(list(filter(lambda x: x % 7 and '7' not in str(x), list(range(1,1000)))))
  4. Out[2]: 293309
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 18:08:55 | 显示全部楼层
total = 0;
for i in range(1000):
    if i%3 == 0 and i%5 == 0 :
        print(i);
        total += i;
print("1000以下3和5倍数之和为:%s" % total);

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 19:05:18 | 显示全部楼层
普通题:
sum=0
for x in range(0,1000):
        if x%3==0 or x%5==0:
                sum=sum+x
if x==999:
                print(sum)
加赛题:
sum=0
for x in range(0,1000):
        if (x%7!=0)and('7' not in str(x)):
                sum=sum+x
if x==999:
        print(sum)

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 20:53:04 | 显示全部楼层
第一题:
  1. sum([x for x in range(1000) if x%3==0 or x%5==0])
复制代码


第二题:
  1. def ii(i):
  2.     while i>0:
  3.         if i%10==7:
  4.             return False
  5.         i/=10
  6.         if i<=0:
  7.             return True
  8. if __name__=="__main__":
  9.     count=0
  10.     for i in [x for x in range(1000) if x%7!=0]:
  11.         if ii(i):
  12.             count+=i
  13.     print(count)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 21:45:59 | 显示全部楼层
本帖最后由 wuyaqi45 于 2016-2-24 21:47 编辑

def Sum(y):
    j = 0      
    for x in xrange(y):
        
        if x <>0 and x%5==0 and x%3==0:
            j=x+j
        
            
            
    print 'Sum ',j

点评

程序有误:这样得到的是既是3的倍数也是5的倍数,且在Sum函数外引用j错误。  发表于 2016-3-2 21:20
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-25 07:40:28 | 显示全部楼层
本帖最后由 zooo 于 2016-2-28 16:32 编辑

支持楼主~
  1. #方法一:filter(产生的是一个迭代器,不会增加内存负担~ 因此个人认为比方法二好)
  2. print('第一题:',sum( filter( lambda x : not x%3 or not x%5 , range(1000) ) ))
  3. print( '第二题:',sum(filter(lambda x : x % 7 and ('7' not in str(x)),range(1000))) )
  4. #方法二:列表推导式
  5. print('第一题',sum(x for x in range(1000) if not x%3 or not x%5))
  6. print('第二题',sum(x for x in range(1000) if x%7 and '7' not in str(x)))

  7. #结果
  8. #1000内3和5倍数的数字之和为:233168
  9. #1000内中不含7的倍数且每位数字中均不含7的数之和为:293309
复制代码

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-2-25 08:15:05 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-25 08:39:37 | 显示全部楼层
本帖最后由 debi999 于 2016-2-25 08:49 编辑

普通题:

  1. list1 = range(1,1000)
  2. sum=0
  3. for each in list1:
  4.     if each%3==0 or each%5==0:
  5.         sum=sum+each
  6. print(sum)
复制代码


附加题
  1. list1 = range(1,1000)
  2. sum=0
  3. for each in list1:
  4.     if each%7!=0 and ('7' not in str(each)):
  5.         sum+=each
  6. print (sum)
复制代码

这次还是挺简单的。。

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-25 10:25:14 | 显示全部楼层
y=[]
for x in range(1,1000):
     if x%3==0 or x%5==0:
              y.append(x)
sum(y)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-25 14:14:41 | 显示全部楼层
第一题:
  1. sum=0
  2. for n in range(0,1001):
  3.     if n%3==0 and n%5==0:
  4.         sum=sum+n
  5. print(sum)
复制代码


第二题:
  1. sum=0
  2. for n in range(1,1001):
  3.     if n%10!=7 and n/7!=1 and n%7==0:
  4.         sum=sum+n
  5. print(sum)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-25 20:43:09 | 显示全部楼层
sum1=0
i=1
while(i<100):
    if(i%3==0)or(i%5==0):
        sum1=sum1+i
    i=i+1
print(sum1)

点评

很可惜应该是1000以内的数。  发表于 2016-3-2 21:26
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-27 12:47:06 | 显示全部楼层
  1. sum = 0
  2. for num in range(1,1000):
  3.     if num % 3 == 0 or num % 5 == 0:
  4.         sum += num
  5. print(sum)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-27 21:39:32 | 显示全部楼层
真棒,我也要加油啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-25 12:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表