1+11+111+ …+加到2000個1,它的結果中有多少個1 ?
阿里巴巴面試題,數學題,推了半天沒推出來,求數學大神正確推導姿勢,不是程序題!不是程序題!面試官讓你在紙上寫數學推導過程,給出答案←_←
這題直接把答案算出來都不是啥困難的事情。
注意到k個1=令n=2000
原式=
注意到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. 這題目直接全算出來就好了.
熟知:
直接算出來是:
!(
*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位數一共有個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一下。
如圖
推薦閱讀:
※面試題「你抄過別人作業嗎?」你會怎麼回答?
※你在银行面试中总结了哪些经验?
※在面試的時候面試官都會問,「關於我們公司你有什麼需要了解的嗎?」 作為面試官最希望聽到的是什麼?
※互聯網公司最常見的面試演算法題有哪些?
※面試時把地上的廢紙撿起來真的能被錄用嗎?