灵感的来临,没有任何预兆;灵感的消失,也不会有告别仪式;用文字记下她们吧,让灵感永存……

求解f(n)=n

davies 发表于 2005 年 11 月 11 日

有这样一个函数 f(n),对于任意正整数n,它表示从 0 到 n 之间出现“1”的个数,比如 f(1) = 1,  f(13) = 6, 那么下一个能实现 f(n) = n 的数字是什么?

最笨的办法就是用程序暴力求解,不断地计算 f(n),并检验 f(n)=n是否成立,可以得到如下的结果:

  • f[000000001] = 1
  • f[000199981] = 199981
  • f[000199982] = 199982
  • f[000199983] = 199983
  • f[000199984] = 199984
  • f[000199985] = 199985
  • f[000199986] = 199986
  • f[000199987] = 199987
  • f[000199988] = 199988
  • f[000199989] = 199989
  • f[000199990] = 199990
  • f[000200000] = 200000
  • f[000200001] = 200001
  • f[001599981] = 1599981
  • f[001599982] = 1599982

可以看出下一个n是199981,满足f(n) = n。

不用程序,手算也可以求解。f(n) = n 表示 y = f(n) 和 y = n 的交点,通过观察 y = f(n) 的变化可以估计交点的范围。f(n) 的一些关键点如下:

  • f(9) = 1
  • f(99) = 20
  • f(999)  = 300
  • f(9999)  = 4000
  • f(99999)  = 50000
  • f(999999)  = 600000

这是非常有规律的,同时另外一些观点如下:

  • f(19)           = 12  (f(9)*2 + 1*10 )
  • f(199)          = 140   (f(99)*2 + 1*100)
  • f(1999)         = 1600  (同上)
  • f(19999)        = 18000
  • f(199999)       = 200000
  • f(1999999)      = 2200000

它也是很有规律的,它们分别是 y = f(n) - n 的局部极小值点和极大值点。

由于 f(99999) = 50000 < 99999 而 f(199999) = 200000 > 199999, 则这区间内必有交点

199991中包含两个1,它之前的199981也包含两个1,则当 199981 <= n < 199991 时,都有 f(n) = n 成立。199981即为要求的下一个满足条件的数。

网友留言:

我来留言