鱼C论坛

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

题目28:1001×1001的螺旋中两条对角线之和是多少?

[复制链接]
发表于 2015-4-23 22:57:15 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 欧拉计划 于 2015-4-23 23:05 编辑
Number spiral diagonals

Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows:

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

It can be verified that the sum of the numbers on the diagonals is 101.

What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way?

题目:

从数字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 的螺旋中对角线上数字之和是多少?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-1 20:21:41 | 显示全部楼层
  1. count = 1
  2. total = 1
  3. list1 = [[1]]
  4. while True:
  5.       list2 = []
  6.       count += 1
  7.       total += (count - 1)*2*4
  8.       temp = ((count - 1)*2*4+4)/4 - (1)
  9.       tmp = total
  10.       list2.append(tmp)
  11.       while len(list2) <4:
  12.             tmp -= temp
  13.             list2.append(int(tmp))
  14.       list1.append(list2)
  15.       if count >1000:
  16.             break
  17. result = 0
  18. for each in list1:
  19.       result +=sum(each)
  20. print(result)
复制代码

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

使用道具 举报

发表于 2016-9-23 11:47:25 | 显示全部楼层
  1.   1 count = 1
  2.   2 total = 1
  3.   3 list1 = [[1]]
  4.   4 while True:
  5.   5         list2 = []
  6.   6         count += 1
  7.   7         total +=(count-1)*2*4
  8.   8         temp = ((count - 1)*2*4+4)/4-1
  9.   9         tmp = total
  10. 10         list2.append(tmp)
  11. 11         while len(list2) < 4:
  12. 12                 tmp -= temp
  13. 13                 list2.append(int(tmp))
  14. 14         list1.append(list2)
  15. 15         if count > 500:
  16. 16                 break
  17. 17 result = 0
  18. 18 for each in list1:
  19. 19         result += sum(each)
  20. 20 print(result)
复制代码

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

使用道具 举报

发表于 2017-1-12 17:08:55 | 显示全部楼层
本帖最后由 芒果加黄桃 于 2017-1-12 17:09 编辑
  1. # encoding:utf-8
  2. # 1001 * 1001 螺旋对角线之和
  3. from time import time
  4. def euler027(N):
  5.     l_result = [1]
  6.     t = 1
  7.     for step in range(2, N + 1, 2):
  8.         k = 1
  9.         while k <= 4:
  10.             k += 1
  11.             t += step
  12.             l_result.append(t)
  13.     print(sum(l_result))     
  14. if __name__ == '__main__':
  15.     start = time()
  16.     euler027(1001)
  17.     print('cost %.6f sec' % (time() - start))
复制代码

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

使用道具 举报

发表于 2017-1-23 13:05:47 | 显示全部楼层
此代码使用matlab编程
Problem27所用时间为0.0021426秒
Problem27的答案为669171001
  1. %% Problem28
  2. % 题目28:1001×1001的螺旋中两条对角线之和是多少?
  3. function Output=Problem28(Input)
  4.   tic
  5. if nargin==0
  6. Input=1001;
  7. end
  8. Circle=(Input+1)/2;%方阵阶数为n,矩阵圈数为(n+1)/2
  9. Sum=0;
  10. for ii=2:Circle
  11.    Temp=(2*ii-1)^2:-2*(ii-1):(2*ii-3)^2+1;%得到2-501圈的数的数
  12.    Sum=Sum+sum(Temp);
  13. end
  14. Output=Sum+1;%得到第一圈的数
  15. toc
  16. disp('此代码使用matlab编程')
  17. disp(['Problem27所用时间为',num2str(toc),'秒'])
  18. disp(['Problem27的答案为',num2str(Output)])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-18 21:51:07 | 显示全部楼层
  1. sum0=n=1
  2. temp=int(input('请输入螺旋矩阵的边:'))
  3. for i in range(3,temp+1,2):
  4.     for j in range(1,5):
  5.         n+=i-1
  6.         sum0+=n
  7. print('%d×%d的螺旋对角线上数字之和是:%d' %(temp,temp,sum0))
复制代码

请输入螺旋矩阵的边:1001
1001×1001的螺旋对角线上数字之和是:669171001
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 21:34:55 | 显示全部楼层
s=0
for i in range(7,1002,2):
    ys = i**2
    zs = i**2-(i-1)
    zx = zs - (i-1)
    yx = zx-(i-1)
    s+=ys+zs+zx+yx

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

使用道具 举报

发表于 2018-7-29 01:29:42 | 显示全部楼层
'''
这里利用规律发现右上角对角线上的数为3^2,5^2,...,(2n-1)^2,
而另外三个对角的数为(2n-1)^2 -(2n-1-1),
                                (2n-1)^2 -(2n-1-1)*2,
                                (2n-1)^2 -(2n-1-1)*3,
'''
total_sum = 1
for i in range(3, 1002, 2):
        start_num = i**2
        sum1 = start_num
        for x in range(1,4):
                sum1 += (start_num - (i-1) * x)
        total_sum += sum1
print(total_sum)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-29 01:30:56 | 显示全部楼层
'''
这里利用规律发现右上角对角线上的数为3^2,5^2,...,(2n-1)^2,
而另外三个对角的数为(2n-1)^2 -(2n-1-1),
                                (2n-1)^2 -(2n-1-1)*2,
                                (2n-1)^2 -(2n-1-1)*3,
'''
total_sum = 1
for i in range(3, 1002, 2):
        start_num = i**2
        sum1 = start_num
        for x in range(1,4):
                sum1 += (start_num - (i-1) * x)
        total_sum += sum1
print(total_sum)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-29 08:16:45 | 显示全部楼层
  1. public class Spiral{
  2.         public static void main(String[] args){
  3.                 long sum = 1,n = 1;
  4.                 int gap = 2;
  5.                 for(int round = 1;round <= 500;round ++){
  6.                         for(int i = 1;i <= 4;i ++){
  7.                                 n += gap;
  8.                                 sum += n;
  9.                         }
  10.                         gap += 2;
  11.                 }
  12.                 System.out.println(sum);
  13.         }
  14. }
复制代码

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

使用道具 举报

发表于 2019-6-12 14:05:45 | 显示全部楼层
本帖最后由 王小召 于 2019-6-12 14:10 编辑

对角线之和为:669171001
用时:0.17160109999999998 秒

  1. #矩阵长度 N*N :等比数列等差数列结合求和问题
  2. import time

  3. def get_result(n):
  4.     return sum([16 * i ** 2 + 4 * i + 4 for i in range(1, int((n - 1) / 2 + 1))])

  5. print("对角线之和为:{}\n用时:{} 秒".format(get_result(1001), time.process_time()))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-10 12:45:04 | 显示全部楼层
  1. sum = 1
  2. for i in range(3,1002,2):
  3.     m = i*i
  4.     n = m - (i-1)
  5.     x = m - 2*(i-1)
  6.     y = m - 3*(i-1)
  7.     sum =sum + m+n+x+y
  8. print(sum)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-17 11:24:11 | 显示全部楼层
669171001
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int sum = 1;

  5.     int i = 1;
  6.     int j = 2;
  7.     while (i < 1001*1001)
  8.     {
  9.         for (int k = 0; k < 4; ++k) {
  10.             i += j;
  11.             sum += i;
  12.         }
  13.         j += 2;
  14.     }

  15.     printf("%d", sum);
  16.     return 0;
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-2 19:39:11 | 显示全部楼层

                               
登录/注册后可看大图

寻找规律,推出矩形框右边两数之和的通式
每个矩形框的左边两数之和与右边两数之和相等
  1. #include<iostream>
  2. using namespace std;

  3. int main(){
  4.   int sum = 1;

  5.   for (int i = 3;i <= 1001;i+=2)
  6.     sum += 2*(2*i*i - 3*i + 3);

  7.   cout << sum;
  8.   return 0;
  9. }
复制代码

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

使用道具 举报

发表于 2020-10-21 16:03:47 | 显示全部楼层
  1. '''1001×1001 的螺旋中对角线上数字之和是多少?'''

  2. '''1.从右下角顺时针旋转依次初始和差为2,递增为8的二阶递增
  3.    2.去除最中间的一'''

  4. def rotate(lines):
  5.     if lines % 2 != 1:
  6.         print("行数需要是单数!")
  7.     else:
  8.         sum = 0
  9.         a1 = 3
  10.         b1 = 10
  11.         for i in range(4):
  12.             an = a1
  13.             bn = b1
  14.             for i in range(int((lines - 1)/2)):
  15.                 sum += an
  16.                 an += bn
  17.                 bn += 8
  18.             a1 += 2
  19.             b1 += 2
  20.         sum += 1
  21.         print("在%d * %d 的螺旋中对角线上数字之和是:%d" %(lines,lines,sum))

  22. start = time.time()
  23. rotate(1001)
  24. end = time.time()
  25. print("共用时%f秒" %(end - start))
复制代码


在1001 * 1001 的螺旋中对角线上数字之和是:669171001
共用时0.000496秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 21:33:03 | 显示全部楼层
  1. #include <stdio.h>

  2. main()
  3. {
  4.         int i, sum = 1;
  5.         int        ne, nw, se, sw;//分别为东北,西北,西南,东南角的数
  6.        

  7.         for (i = 3; i < 1002; i += 2)
  8.         {
  9.                 ne = i * i;
  10.                 nw = ne - i + 1;
  11.                 sw = nw - i + 1;
  12.                 se = sw - i + 1;
  13.                 sum += ne + nw + sw + se;
  14.         }
  15.         printf("%d", sum);
  16. }
复制代码


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

使用道具 举报

发表于 2021-8-7 07:45:32 | 显示全部楼层
本帖最后由 mathtimes 于 2021-8-7 08:17 编辑

4段对角线函数分别是:
4x^2-4x+1
4x^2-6x+3
4x^2-8x+5
4x^2-10x+7
总和是16x^2-28x+16
减去重合的三个一
然后再求和

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int i, sum = 0;
  5.         for(i=1;i<=501;i++)
  6.                 sum += 16*i*i-28*i+16;
  7.         printf("%d", sum-3);
  8. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 00:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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