求算式和 sum = 100/(1+0+0)+101/(1+0+1)+102/(1+0+2)+...+998/(9+9+8)+999/(9+9+9)

2021/04/09

没什么好的思路,简单写一个程序,运算结果为36418.5


#!/usr/bin/env ruby
#求算式的和
#sum =  100/(1+0+0)+101/(1+0+1)+102/(1+0+2)+...+998/(9+9+8)+999/(9+9+9)
#the result is: 36418.5
sum = 0
(100..999).each do |i|
  b = 0
  c = 0
  #求出每个数i的数字和,比如100数字和是1,101数字和是2
  #把数字和存到符号b中
  i.to_s.split("").each {|k| b+=k.to_i}
  #求出i/其数字和b,结果存到符号c中
  c = i.to_f/b.to_f
  #把每个i的运算结果求和,保存到sum中,sum是全局变量,可以在循环外部引用
  sum += c
end
puts ">>>>>>>>>>>>>>>>the result is: #{sum}"

【5星难度】20182018...2018x151514141313...0707的计算结果有多少个奇数数字

2021/01/20

这是一道18年迎春杯小高组的计算题,我认为很难,太为难小朋友了吧。


原题如下:

20182018...2018(共18个2018)x151514141313...0707的计算结果有多少个奇数数字。



解析:

数字小可以直接算,对于原题这个思路就直接放弃。

那么分析两个数,

20182018...2018(共18个2018) = 2018*00010001...0001(18组0001)

设 151514141313...0707 = S1

S1的数字和为90,那么S1能被9整除

S1的奇数位数字和减去偶数位数字和是66,S1能被11整除

通过观察S1能被101整除,因为S1符合截取两位数的判定方法,即:

一个多位数,截取末两位,由末两位和之前的高位,各形成一个新数,这两个新数相减,
重复上述步骤,直至差足够小,这个差能被101整除,则原数能被101整除。

所以S1能被 9 * 11*101=9999整除

设 S1 = 9999 * S2(S2是1开头的32位数)

那么,

原式 = 2018*00010001...0001(18组0001)* 9999 * S2

=2018*00010001...0001(18组0001) * 9999 * S2

=9999(72个9)*S2

=9999(72个9)*S2*2018

设 S2*2018 = S3,S3应该有35位(因为S2是1开头的32位数)

故原式 = 9999(72个9)*S3(35位数)


分析到这一步,原式已被大大的化简,离最后的结果还有一步。

一般我们做某个数N*999,会改为N*(1000-1)来做

这里也用这个思路试试:

原式 = 【1000...0(72个0)-1】*S3

=S3*1000..0(72个0)-S3

=(S3-1)99...9(99...9-S3+1)【这是减法借位之后的结果描述】

第一部分S3-1是35位的一个数

中间部分999..9有37位(因为原来有72个0)

最后一部分99..9-S3+1仍然是一个35位数


可以看到,第一部分和最后一部分的和恰好是999..9(共35位9),那么

我们可以判断第一部分和最后一部分的奇偶位是互补的,

举个例子:

S3=728

728-1 = 727 和 999-728+1 = 272

9是奇数,必然是一个奇数加一个偶数得到,所以

727和272奇偶位互补,

连起来的这个数字727272奇数位和偶数位数量相同

所以原式=(S3-1)99...9(99...9-S3+1)

有奇数数字35+37=72个,偶数数字35个,总位数107位



补:

我们可以进一步猜测:

 999...9(N个9)*S1(M位数),只要M<N那么结果就有N个奇数

这个猜测的证明与上面过程类似,留给小朋友们作为作业吧。


【4星难度】一道应用缩放法的计算题19*(1/10^2+1/11^。。。+1/2014^2)

2020/09/12

原题如下:

求 19 * (1/10^2+1/11^2+1/12^2+...+1/2013^2+1/2014^2)的结果整数部分。

10^2表示10的2次方


///////////////////////////////////////////////////////////

先自行思考20分钟,

找找思路,

试探一下各种方法

///////////////////////////////////////////////////////////


这类问题硬着头皮算是不可行了,除非用计算机写个小程序。但在考场上,应该也不方便写程序了。

所以必须考虑其他方法。

这是个估值问题,不需要计算准确结果。估值就自然想到缩放法,即找值的上限和下限

比如,设原式的值为P,我们有 P>0,也容易得到 P<19*0.01*2005<381(把每个分数都看成1/10^2,共2005个分数)

那如何找出更小的界限?

我们从单个分数入手

1/10^2=1/(10*10)=1/100

针对1/100,最小的估值界限我们有:

1/101<1/100<1/99

同样,1/11^2

1/122<1/121<1/120

以此类推,这样问题就转化为求 1/101+1/122+1/145 +。。。+Last的和,这是最小值。

这些分数之间并没有什么计算模式可以联系,让求和过程变得简单。

这个思路不是很理想,必须换一换。


这次我们对缩放以后的分数数列要能够方便求和的角度出发重新进行考虑,

分数数列求和有一种模式是前后能销项,如:

1/2*3+1/3*4+1/4*5=1/2-1/3+1/3-1/4+1/4-1/5=1/2-1/5


这种模式和原题应该有某种联系,这是我们灵感一闪的时刻 :)

缩放法相比普通计算题更有创新性和挑战性,我们可以自己设计缩放的模式。


这次这样来设计:

1/(10*11)<1/(10*10)<1/(9*10)

1/(11*12)<1/(11*11)<1/(10*11)

。。。

1/(2014*2015)<1/(2014*2014)<1/(2013*2014)

这样求和实际上就是裂项后销项的处理过程了,

最后设原式=P,有

19*(1/10-1/2015)<P<19*(1/9-1/2014)

通过计算:

1.89<P<2.10

? 好像还确定不了P的整数部分,因为可能为1也可能为2。


看来我们这上边界还大了,需要再缩小。

还是考虑裂项,这么设计会不会更小?

1/(10*10)<1/(9.5*10.5)

1/(11*11)<1/(10.5*11.5)

保持分母两个数间隔1,这么算下来那么

P<19*(1/9.5-1/2014.5)=1.991

那么P<2

所以P的整数部分是 1

答毕。