1+11+111+ …+加到2000個1,它的結果中有多少個1 ?

阿里巴巴面試題,數學題,推了半天沒推出來,求數學大神正確推導姿勢,不是程序題!不是程序題!面試官讓你在紙上寫數學推導過程,給出答案←_←


這題直接把答案算出來都不是啥困難的事情。
注意到k個1=(10^k-1)/9令n=2000
原式=sum_{k=1}^{n}frac{10^k-1}{9} = frac{1}{9}(sum_{k=1}^{n}10^k -n)=frac{10^{n+1}-9n-10}{81}
注意到1/81=0.012345679循環,簡單算下餘數就知道10^2001除以81餘28 所以

(10^2001-28)/81=(0.012345679把小數點往右移2001位)=(222個012345679)012

所以原式
=(10^2001-28)/81-(9*2000+10-28)/81
=(222個012345679)012 -222
=(221個012345679)012345678790

然後就發現答案是222個1了。
其實我覺得問有幾個8才比較有意思呢23333 一定想不到是1個。。。。


你們幹嘛想這麼多, 我覺得這個題真的很Simple. 這題目直接全算出來就好了.
熟知:
a_n = frac{1}{9}(10^n -1)\
S_n = sum_{i=1}^n a_n = frac{1}{9}(sum_{i=1}^n 10^i -n)\
= frac{10^{n+1}-9n-10}{81}

n=2000代入,可以知道S_{2000}里一共有222個1.


直接算出來是:

!(
*UnderoverscriptBox[([Sum]), (n = 1), (2000)]((
*UnderoverscriptBox[([Sum]), (i = 0), (n - 1)]
*SuperscriptBox[(10), (i)])))

Out =
1234567901234567901234567901234567901234567901234567901234567901234567
9012345679012345679012345679012345679012345679012345679012345679012345
6790123456790123456790123456790123456790123456790123456790123456790123
4567901234567901234567901234567901234567901234567901234567901234567901
2345679012345679012345679012345679012345679012345679012345679012345679
0123456790123456790123456790123456790123456790123456790123456790123456
7901234567901234567901234567901234567901234567901234567901234567901234
5679012345679012345679012345679012345679012345679012345679012345679012
3456790123456790123456790123456790123456790123456790123456790123456790
1234567901234567901234567901234567901234567901234567901234567901234567
9012345679012345679012345679012345679012345679012345679012345679012345
6790123456790123456790123456790123456790123456790123456790123456790123
4567901234567901234567901234567901234567901234567901234567901234567901
2345679012345679012345679012345679012345679012345679012345679012345679
0123456790123456790123456790123456790123456790123456790123456790123456
7901234567901234567901234567901234567901234567901234567901234567901234
5679012345679012345679012345679012345679012345679012345679012345679012
3456790123456790123456790123456790123456790123456790123456790123456790
1234567901234567901234567901234567901234567901234567901234567901234567
9012345679012345679012345679012345679012345679012345679012345679012345
6790123456790123456790123456790123456790123456790123456790123456790123
4567901234567901234567901234567901234567901234567901234567901234567901
2345679012345679012345679012345679012345679012345679012345679012345679
0123456790123456790123456790123456790123456790123456790123456790123456
7901234567901234567901234567901234567901234567901234567901234567901234
5679012345679012345679012345679012345679012345679012345679012345679012
3456790123456790123456790123456790123456790123456790123456790123456790
1234567901234567901234567901234567901234567901234567901234567901234567
9012345679012345679012345679012345678790

所以可以算得:

StringCount[IntegerString[%4], "1"]
Out = 222

共222個1。


summ = 0
for i in range(1, 2001):
k = (10 ** i - 1) // 9
summ = summ + k
print(summ)

結果是12345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345678790

hoho 大家都挺喜歡用硬算的啊~


每十個數多一個1,每十個數多出來這個1再多10個再多一個。所以如果n個1111...1,n是一個k位數一共有Sigma_{i=1}^k  ceiling(frac{n}{10^i})個1出現
所以是200+20+2=222個
=======
這個做法的確有問題, 有時間再來改.反例:11, 12, 700, 800等等等等...詳見評論區


硬算是可以計算的,而且如果真的是測試題硬算是比較靠譜的方法。

S=1+11+111+1111+11111+……+111……1(2000個1)
10S+2000=11+111+1111+11111+……+111……11(2001個1)
下式減上式有
9S=111……109110(1996個1)
S=123456790 123456790 123456790 …… 12345678790(221個123456790)
所以有222個1


def c1(x):
return sum([int("1"*i) for i in range(1,x+1)])

print str(c1(2000)).count("1")

222個


熱烈恭賀知乎新增【計算器】功能。


這樣

str(sum(10 ** i / 9 for i in xrange(2001))).count("1")

222

update:
至於筆算,反正+11111...1一定會出現123456790這個模式,考慮到它會趨向於10^n / 8.1。
末九位是:

123456789 + 111111111 × (n-9)

算一下就好了(逃



你加20次就可以發現其實是

123456790 9位數循環,2000除以9 就是222整數,其餘都不用看了,你把2000看成N,它總在以123456790循環,而這個9位循環只有1個1,所以最終答案就是222,其實連結果答案都能列出來,
-----------
看了排第一的答案,出乎我的意料,雖然總體找規律思路沒問題,但結果我還真沒仔細去算,最後幾位竟然是8790……要問幾個8,我肯定回答1個都沒有,哈哈……


二進位還是十進位?


題目有說明這是幾進位的嗎,如果是二進位的話會好辦點。題主可以從這方面考慮。


C++新手一枚,代碼獻醜了。。。
#include&
#include&
using namespace std;
int main()
{
char one[2000],sum[2001];
memset(one, "0", sizeof(one));
memset(sum, "0", sizeof(sum));
for (int i = 0; i &< 2000; i++)
{
one[i]++;
for (int j = 0; j &< 2000; j++)
{
sum[j] += one[j] - "0";
if (sum[j] - "0"&>9)
{
int temp = sum[j] - "0";
sum[j + 1] += temp/10;
temp = temp % 10;
sum[j] = "0" + temp;
}
}
}
int count = 0;
for (int i = 0; i &< 2001; i++)
{
if (sum[i] == "1")
{
count++;
}
}
cout &<&< count &<&< endl;
return 0;
}
答案222


mathematica暴力解決


我覺得HR應該在考你能不能想到進位的問題。


為啥這麼肯定?在二進位中呢?


加上9+99+999……兩千個9除以10。就是10+100+1000……10兩千次方這個等於1999個1加一個0。除以10。答案是1999個1。


找規律得到是,1234567890的循環,2000除以9就好了。


看來大家都挺喜歡直接數列…那麼我算出來也是222個…假如是數8的個數好像也許會簡單一些


目測是n整除9然後加上餘數k的前k位1的個數是答案。先mark一下。


如圖


推薦閱讀:

面試題「你抄過別人作業嗎?」你會怎麼回答?
你在银行面试中总结了哪些经验?
在面試的時候面試官都會問,「關於我們公司你有什麼需要了解的嗎?」 作為面試官最希望聽到的是什麼?
互聯網公司最常見的面試演算法題有哪些?
面試時把地上的廢紙撿起來真的能被錄用嗎?

TAG:阿里巴巴集團 | 數學 | 面試問題 |