当前位置: 首页 > news >正文

建设网站的网站做性的网站有哪些

建设网站的网站,做性的网站有哪些,如何设置网站服务器,海南网站优化公司昨天,小孩问了我一个python编程竞赛题,我看了一下题目,是一个数列编程的问题,我在想,小学五年级的学生能搞得懂吗?反正我家小孩是没有搞懂,不知道别人家的小孩能不能搞明白。所以我花了一点时间…

        昨天,小孩问了我一个python编程竞赛题,我看了一下题目,是一个数列编程的问题,我在想,小学五年级的学生能搞得懂吗?反正我家小孩是没有搞懂,不知道别人家的小孩能不能搞明白。所以我花了一点时间,把编程思路记录下来。第一个方案采样通用的方法,循环处理,但这样的程序时间复杂度与输入的值成正比,然后我又想了第二种方案,采用算式计算的方法,时间复杂度与输入无关。以下是我的分析思路:

        

国王将金币作为工资,发放给忠诚的骑士。

第一天骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四,五,六天),每天收到三枚金币;之后四天,每天收到四枚金币,依次类推;这种工资发放模式会一直延续下去,当连续N天收到N枚金币后,骑士会在之后的N+1天,每天收到N+1枚金币。【白名单竞赛NOC】

请编写程序计算前M天里,骑士一共获得了多少金币。

【输入格式】输入包含一个正整数M,表示发放金币的天数。

【输出格式】输出一个正整数,即骑士收到的金币数。

【输入样例】

6

【输出样例】

14

分析:

天数:         1   2   3   4   5   6   7   8   9   10   11   12   13   14   15 ......

金币数:      1   2   2   3   3   3   4   4   4   4     5     5     5     5     5 ......

总数:          1   3   5   8  11 14 18 22 26 30   35   40   45   50   55 ......

可以知道:

第1天收到1枚金币,第二三天每天收到2枚金币,第四五六天每天收到3枚金币,第七八九十天每天收到4枚金币,按这个规律一直持续下去;

每天发放金币的数量的增长规律是:1,2,3,4,5,6,。。。即1枚金币发放1天,2枚金币发放2天,3枚金币发放3天。。。N枚金币发放N天;

所以发放的金币总数量:  (假设N枚金币刚好连续发放了N天)

total = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4  + ... + N * N

题目需求是:用户输入天数M,输出发放的总的金币数;

所以首先我们要根据天数M,计算出当天发放的金币数N。

我们从上述表格中可以看出:在第1,3,6,10,15,。。。天的时候,当天发放的金币数量是1,2,3,4,5,。。。;并且1枚金币发了1天,2枚金币发了2天,。。。5枚金币刚好发了5天;

所以,我们首先假设用户刚好输入的是1,3,6,10,15,。。。这些天数,然后我们根据这些天数来计算当天应该发放的金币数N;

现在开始找规律:当M=1时:N=1;

当M=3时:M=1+2; N=2;

当M=6时:M=1+2+3; N=3;

当M=10时:M=1+2+3+4; N=4;

当M=15时:M=1+2+3+4+5; N=5;

......

从上述规律可以看出M的值为:M = 1 + 2 + 3 + 4 + 5 + ... + N

这样我们可以使用循环来进行计数累加,当累加值大于等于M时,循环终止,此时计数值即为N。

最后考虑到用户输入的值会小于累加值,在计算总金币数的时候要减掉(M-用户输入)*N的数量。

程序如下:

M = int( input( “请输入一个正整数:” ) )

num = 0

total = 0

for N in range( 1,M ) :

        num = num + N

        total = total + N * N

        if num >= M :

                total = total - ( num - M ) * N

                break

print( total )

上述程序虽说可以正确输出结果,但是程序运行的时间随着用户输入的数值变大而变长,下面我们换一种方法,使得程序的运行时间与输入无关。

上面的分析我们已经知道:(当用户刚好输入的是1,3,6,10,15,。。。这些天数)

M = 1 + 2 + 3 + 4 + 5 + ... + N = N * ( N + 1 ) / 2

当N1=1时:M1= N1 * ( N1 + 1 ) / 2 = 1;

当N2=2时:M2= N2 * ( N2 + 1 ) / 2 = 3;

当N3=3时:M3= N3 * ( N3 + 1 ) / 2 = 6;

当N4=4时:M4= N4 * ( N4 + 1 ) / 2 = 10;

当N5=5时:M5= N5 * ( N5 + 1 ) / 2 = 15;

......

考虑到等式:M = N * ( N + 1 ) / 2 即:

N*N + N - 2*M = 0 (1)

解方程得:N= ( sqrt( 1 + 8 * M ) - 1 ) / 2

上面分析我们已经知道总金币数:

total = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4  + ... + N * N

我们用N1,N2,N3,......,NN表示总金币数:

total = N1*N1 + N2*N2 + N3*N3+ N4*N4  + ... + Nn*Nn 

用式1代入得:

total = ( 2 * M1 - N1 ) + ( 2 * M2 - N2 ) + ( 2 * M3 - N3 ) + ... +  ( 2 * Mn - Nn )

= 2 * ( M1 + M2 + M3 + ... + Mn ) - ( N1 + N2 + N3 + ... + Nn )

N1 + N2 + N3 + ... + Nn 为数列和:1+2+3+4+...+N = N*(N+1)/2 = Mn

M1 + M2 + M3 + ... + Mn 为数列和:1+3+6+10+15+... +Mn = N*(N+1)*(N+2)/6

所以:total = 2 * ( M1 + M2 + M3 + ... + Mn ) - ( N1 + N2 + N3 + ... + Nn )

= 2 * N * ( N + 1 ) * ( N + 2 ) / 6 - N * ( N + 1 ) / 2

= N * ( N + 1 ) * ( 2 * N + 1 ) / 6

= Mn * ( 2 * N + 1 ) / 3

考虑到用户输入的数值M小于Mn , 修正总数为:

total = Mn * ( 2 * N + 1 ) / 3 - ( Mn - M ) * N

= ( 3 * M * N + Mn - Mn * N ) / 3

最后程序如下:

import math

M = int( input( “请输入一个正整数:” ) )

Nf = ( math.sqrt( 1 + 8 * M ) - 1 ) / 2

N = int( Nf )

if Nf > N:

        N = N + 1

Mn = N * ( N + 1 ) / 2

total = ( 3 * M * N + Mn - Mn * N ) / 3

print( total )

http://www.yayakq.cn/news/10071/

相关文章:

  • 网站设置搜索框是什么知识点品牌策划网站建设
  • 怎么做网站网站建筑公司分几级资质
  • 网站建设开发网站案例项目费用企业所得税的征收方式有
  • 网站优化分析软件加工设备网
  • 怎样才能建设一歌网站亚马逊电商平台入口
  • wordpress网站搬福州seo外包公司
  • 国际贸易网站排名搜狗识图
  • 建网站建设网站wordpress 分类判断
  • 网站建设126私域视频
  • 广西汽车网网站建设网站制作的基本步骤是
  • 布局网站开发如何给网站做权重
  • 上海迈诺网站建设个人网站 虚拟主机
  • 临沂吧网站建设wordpress图片不显示
  • 企业建站套餐巩义网络推广
  • wap网站制作模板网站建设推广用兴田德润
  • 有专门做特产的网站吗百度seo优化推广公司
  • 深圳做男装什么网站容易找工qq网页版登录官网登录入口
  • 网站服务器租用价格多少钱一年网站开发要注意的问题
  • 用织梦做的网站一般后台大学 建网站
  • 济南哪家公司做网站好椒江网站建设
  • 小语种网站建设要点优秀网页制作模板
  • 手机自适应网站公司简介模板范文高大上
  • 网站后台传不上图片软件开发的步骤流程
  • 东莞app培训网站建设wordpress配置163邮箱
  • 宁波网站免费制作工程建设教育网站
  • 辽宁网站设计视频制作流程
  • 关于建设网站的通知wordpress 淘宝客api
  • 北京有哪些网站建设公司小说推广赚钱平台哪个好
  • 博客网站推广法平台制作网站公司
  • 深圳招聘网站大全广西网站建设服务好