鱼C论坛

 找回密码
 立即注册
查看: 2718|回复: 16

[技术交流] 小练习:20160718 1001×1001的螺旋中两条对角线之和是多少

[复制链接]
发表于 2016-7-18 10:00:00 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2016-7-26 11:07 编辑

从现在开始我们要开展一批欧拉计划的习题练习。
其实在我们论坛中已有欧拉计划的板块,可能有些鱼油还没注意到。
什么是欧拉计划:http://bbs.fishc.com/thread-60405-1-1.html
我们欧拉板块现已给出了81道题,这批练习将从欧拉计划中选题。其实用python语言完成有很多的优势,可以更简洁更方便的实现。
如果大家有兴趣也可浏览欧拉的英文网站:https://projecteuler.net/archives
这里已经有了500余题。


                               
登录/注册后可看大图

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




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

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

----除列出程序外,请给出输出的结果。----


题目:

从数字1开始向右顺时针方向移动,可以得到如下的 5×5 的螺旋:

21 22  23  24  25
20   7   8   9   10
19   6   1   2   11
18   5   4   3   12
17  16  15  14  13

可以算出对角线上数字之和是 101.

1001×1001 的螺旋中对角线上数字之和是多少?


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





本来把我的思路加到回复可见中,但没考虑到对VIP会员是直接可见的,感谢 bacon6581  指正。

评分

参与人数 2荣誉 +9 鱼币 +9 贡献 +6 收起 理由
小火木 + 4 + 4 + 3 这数字是有规律的,要不让大家先试着生成一.
bacon6581 + 5 + 5 + 3 老大,你又走光了!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-18 13:43:53 | 显示全部楼层
我的思路:
除最中间的1以外,每圈的4个数字之间的差值为2, 4, 6 。。。依次把对角的4个数字相加即可。

  1. def fn(n):
  2.     i = 1
  3.     sum = 1
  4.     diff = 2
  5.     for c in range(3, n + 1, 2):
  6.         sum += i * 4 +diff * 10
  7.         i +=4*diff
  8.         diff += 2
  9.     return sum
  10. print('1001×1001 的螺旋中对角线上数字之和是:', fn(1001))
复制代码





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-18 20:24:38 | 显示全部楼层
本帖最后由 huomqh 于 2016-7-18 23:59 编辑

方法一:(速度快到没朋友)
  1. import time
  2. tt=time.time()
  3. n=1001
  4. s=1
  5. for i in range(2,(n+1)//2+1):
  6.     s+=4*((i-1)*(4*i-3)+1)
  7. print('答案:%d,用时:%.4f s'%(s,time.time() - tt))
复制代码

  1. 答案:669171001,用时:0.0000 s
复制代码


方法二:(第一种方法的朋友)
  1. import time
  2. tt=time.time()
  3. n=1001
  4. d=-3
  5. a=[1]
  6. i=0
  7. s=-3
  8. while i*2+1<n:
  9.     i+=1
  10.     d+=8
  11.     a.append(a[i-1]+d)
  12. for j in a:
  13.     s+=4*j

  14. print('答案:%d,用时:%.4f s'%(s,time.time() - tt))
复制代码

  1. 答案:669171001,用时:0.0000 s
复制代码


方法三:(用的迭代,速度慢到没朋友,不过写起来不用动脑筋)
  1. def d(x):
  2.     if x==2:
  3.         return 5
  4.     else:
  5.         return d(x-1)+8

  6. def a(x):
  7.     if x==1:
  8.         return 1
  9.     else:
  10.         return a(x-1)+d(x)
  11.    
  12. import time
  13. tt=time.time()
  14. n=1001
  15. s=1
  16. for i in range(2,((n+1)//2+1)):
  17.     s+=4*a(i)

  18. print('答案:%d,用时:%.4f s'%(s,time.time() - tt))
复制代码
  1. 答案:669171001,用时:6.2856 s
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-19 00:01:43 | 显示全部楼层
本周的题有点简单,是不是考虑给个附加题啊~

点评

这几期的题目很简单,考虑到让更多的鱼油能够参与,就没有再加上附加题。  发表于 2016-7-26 17:51
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-19 08:35:07 | 显示全部楼层
  1. #答案为669171001
  2. def djx(n):
  3.     s = 1
  4.     if n == 1:
  5.         return s
  6.     else:
  7.         a, b, c, d, k = 0, 0, 0, 1, 2
  8.         m = (n+1)/2
  9.         for i in range(2, int(m+1)):
  10.             a = d + k
  11.             b = a + k
  12.             c = b + k
  13.             d = c + k
  14.             s = s + a + b + c + d
  15.             k += 2
  16.         return s

  17. print(djx(1001))
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-19 10:11:05 | 显示全部楼层
  1. def a(n):
  2.        su=-1*(n**2-1)//4*3
  3.        while n>1:
  4.               su+=2*n**2
  5.               n-=2
  6.        return 2*su+1

  7. print(a(1001))
  8. 669171001
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-19 12:55:00 | 显示全部楼层
inc = 2
sum1 = 1
num = 1

while inc <= 1001:
    for i in range(4):
        num += inc
        sum1 += num
    inc += 2

print(sum1)
   
答案:669171001
好没有新意的解法。。。

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-19 16:50:35 | 显示全部楼层
本帖最后由 wangzhenas 于 2016-7-19 19:09 编辑

一行搞定, 答案: 669171001
思路是每一圈右上角的数总是1,3,5...的平方, 每一圈的四个数平均值是等于右上角的数减去该行数量减一,再减去左边的半行,最后再加上中间的1就ok了

  1. print(sum(4*(i**2-(i-1)-(i-1)//2) for i in range(1001,1,-2)) +1)
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-19 22:16:11 | 显示全部楼层
  1. print(sum([1]+[4*i*i-6*i+6 for i in range(3,1002,2)]))
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-19 23:22:36 | 显示全部楼层
  1. import time
  2. on=time.time()

  3. j = 1#用来计算步长
  4. sums = 1#从1开始加
  5. sum_end = 1#
  6. for i in  range(3,1002,2):
  7.     d = j*2#步长
  8.     sum_first = sum_end + d
  9.     sum_end = d*3 + sum_first
  10.     sums += 2*(sum_first + sum_end)
  11.     j += 1
  12. print(sums)
  13. print(time.time()-on)
复制代码

结果:669171001
时间:0.0005137920379638672

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-20 16:40:52 | 显示全部楼层
  1. import time
  2. r = [1]
  3. m = 1
  4. n = 2
  5. t = time.time()
  6. while True:
  7.     for i in range(4):
  8.         m += n
  9.         r.append(m)
  10.     n += 2
  11.     if n > 1001:
  12.         break

  13. print(sum(r))
  14. print(time.time() - t)
复制代码


结果
  1. # 669171001
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-20 20:12:39 | 显示全部楼层
1001×1001 的螺旋中对角线上数字之和是669171001
  1. import time
  2. st = time.time()
  3. def djx(n):
  4.     x = (n+1)/2
  5.     jg = 4*(x*(4*x*x-1)/3-1) - (n+1)*(n-1)/4*6 +1   
  6.     return jg

  7. print("1001×1001 的螺旋中对角线上数字之和是%d" % djx(1001))
  8. length = time.time()-st
  9. print("用时%f秒" % length)
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-21 09:52:12 | 显示全部楼层
  1. # -*- coding:Utf-8 -*-
  2. import time
  3. start= time.clock()

  4. sum_all=1
  5. num_star=1
  6. input_num=1001
  7. for i in range(3,input_num+1,2):
  8.     sum_all=sum_all+4*num_star+10*(i-1)
  9.     num_star=num_star+4*(i-1)
  10. print(sum_all)

  11. end = time.clock()
  12. print ("read: %f s" % (end - start))
复制代码

  1. 计算结果:
  2. 669171001
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 01:14:48 | 显示全部楼层
  1. class Main:
  2.     lenght = 3
  3.     dgl_sum = 1
  4.     dglnum = 1
  5.     #正方形每增大一圈,对角递增的数增大2,n为初始值2
  6.     n = 2
  7.     count = 0#记数4个对角并归零

  8.     def countdgl(self):
  9.         self.dglnum += self.n
  10.         self.dgl_sum += self.dglnum
  11.         return self.dgl_sum

  12.     def main(self):
  13.         while self.lenght <= 1001:
  14.             if self.count < 4:
  15.                 self.count += 1
  16.                 self.countdgl()
  17.             else:
  18.                 self.count = 0
  19.                 self.n += 2
  20.                 self.lenght += 2
  21.         return self.dgl_sum

  22. import time
  23. if __name__ == "__main__":
  24.     tm = time.time()
  25.     x = Main()
  26.     print("1001*1001的螺旋对角之和为 %d ,总耗时 %0.5f s" % (x.main(),(time.time()-tm)))
复制代码


结果1001*1001的螺旋对角之和为 669171001 ,总耗时 0.00500 s

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 09:42:44 | 显示全部楼层
  1. def getResult(n):
  2.     result = [1];
  3.     for k in range(1, int((n+1)/2)):
  4.         for i in range(1, 5):
  5.             result.append(result[-1]+2*k)
  6.     return sum(result)

  7. if  __name__ == '__main__':
  8.     n = 1001
  9.     print(getResult(n))
  10. #结果:669171001
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-25 02:26:09 | 显示全部楼层
  1. n=2
  2. i=1
  3. sm=1
  4. while n<1001:
  5.     for k in range(4):
  6.         i+=n
  7.         sm+=i
  8.     n+=2
  9. print(sm)
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-17 01:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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