Ten Googol
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 160 Accepted Submission(s): 81
Problem Description
Google的面試題向來以古怪聞名,延續自技術公司用邏輯題測試求職者的古老傳統.現在我們來看看下面這題:
面試官在房間的白板上寫下6個數字:
10,9,60,90,70,66
現在的問題是,接下來該出現什麼數字?
想不出來了吧?不要再從數學的角度想了,把這些數字用正常的英文拼寫出來:
ten(10)
nine(9)
sixty(60)
ninety(90)
seventy(70)
sixty-six(66)
我們可以驚奇的發現這些數字都是按字母的多少排序的!再仔細一看:ten(10)不是唯一一個可以用3個字母拼出的數字,還有one(1),two(2),six(6);nine(9)也不是唯一一個用4個字母拼出的數字,還有zero(0),four(4)和five(5).而題目中的數字,每一個都是用給定長度的字母拼寫出來的數字裏最大的一個!
現在我們回到原題:接下去該是哪個數字呢?
我們注意到,66對應的字母長度爲8(特別提醒:連接符不算在內),不管之後跟着哪個數,它都應該有9個字母,而且應該是9個字母拼出的數字裏最大的。仔細找一下,你可能就會得出ninety-six(96)。不可能是100以上的數字,因爲它會以one hundred開頭,這已經有10個字母了。
對於Google面試官來說,96只不過是可以接受的答案之一,另一個更好的回答是:
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
也就是10的101次方,即:ten googol(有關Googol的資料可以在wiki中瞭解)。據說當年Google這個名字的創建也是由googol演化過來的(江湖傳說肖恩拼寫時老愛出錯,本來想註冊googol或者googolplex,結果由於手誤就註冊了google)。
好了,當你解出了這道難題,面試官的下一道題目接踵而至——給你兩個正整數N和M,要求你輸出由N個字母組成的第M大數(我們只考慮0~99和googol級別的數字)。
注意:這裏所說的“第M大數”是指從小到大的第M大,具體參見Sample
面試官在房間的白板上寫下6個數字:
10,9,60,90,70,66
現在的問題是,接下來該出現什麼數字?
想不出來了吧?不要再從數學的角度想了,把這些數字用正常的英文拼寫出來:
ten(10)
nine(9)
sixty(60)
ninety(90)
seventy(70)
sixty-six(66)
我們可以驚奇的發現這些數字都是按字母的多少排序的!再仔細一看:ten(10)不是唯一一個可以用3個字母拼出的數字,還有one(1),two(2),six(6);nine(9)也不是唯一一個用4個字母拼出的數字,還有zero(0),four(4)和five(5).而題目中的數字,每一個都是用給定長度的字母拼寫出來的數字裏最大的一個!
現在我們回到原題:接下去該是哪個數字呢?
我們注意到,66對應的字母長度爲8(特別提醒:連接符不算在內),不管之後跟着哪個數,它都應該有9個字母,而且應該是9個字母拼出的數字裏最大的。仔細找一下,你可能就會得出ninety-six(96)。不可能是100以上的數字,因爲它會以one hundred開頭,這已經有10個字母了。
對於Google面試官來說,96只不過是可以接受的答案之一,另一個更好的回答是:
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
也就是10的101次方,即:ten googol(有關Googol的資料可以在wiki中瞭解)。據說當年Google這個名字的創建也是由googol演化過來的(江湖傳說肖恩拼寫時老愛出錯,本來想註冊googol或者googolplex,結果由於手誤就註冊了google)。
好了,當你解出了這道難題,面試官的下一道題目接踵而至——給你兩個正整數N和M,要求你輸出由N個字母組成的第M大數(我們只考慮0~99和googol級別的數字)。
注意:這裏所說的“第M大數”是指從小到大的第M大,具體參見Sample
Input
輸入數據第一行有一個數字T,代表有T組數據。
每組數字由兩個正整數N和M組成。
[Technical Specification]
1<=T<=100
3<=N<=9
1<=M<=100
每組數字由兩個正整數N和M組成。
[Technical Specification]
1<=T<=100
3<=N<=9
1<=M<=100
Output
首先輸出case數(見sample),接着輸出由N個字母組成的第M大數,如果沒有,則輸出-1。
Sample Input
6
3 1
3 2
4 1
4 2
5 1
9 100
Sample Output
Case #1: 1
Case #2: 2
Case #3: 0
Case #4: 4
Case #5: 3
Case #6: -1
Source
Recommend
liuyiding
AC代碼:
#include<stdio.h>
int main()
{
int T,N,M,i,j;
int a[4]={1,2,6,10};
int b[4]={0,4,5,9};
int c[6]={3,7,8,40,50,60};
int d[6]={11,12,20,30,80,90};
int e[3]={15,16,70};
int f[13]={13,14,18,19,41,42,46,51,52,56,61,62,66};
int g[22]={17,21,22,26,31,32,36,44,45,49,54,55,59,64,65,69,81,82,86,91,92,96};
scanf("%d",&T);
for(i=1;i<=T;i++)
{
scanf("%d%d",&N,&M);
if(N==3)
{
if(M>4) printf("Case #%d: -1\n",i);
else printf("Case #%d: %d\n",i,a[M-1]);
}
if(N==4)
{
if(M>4) printf("Case #%d: -1\n",i);
else printf("Case #%d: %d\n",i,b[M-1]);
}
if(N==5)
{
if(M>6) printf("Case #%d: -1\n",i);
else printf("Case #%d: %d\n",i,c[M-1]);
}
if(N==6)
{
if(M>6) printf("Case #%d: -1\n",i);
else printf("Case #%d: %d\n",i,d[M-1]);
}
if(N==7)
{
if(M>3) printf("Case #%d: -1\n",i);
else printf("Case #%d: %d\n",i,e[M-1]);
}
if(N==8)
{
if(M>13) printf("Case #%d: -1\n",i);
else printf("Case #%d: %d\n",i,f[M-1]);
}
if(N==9)
{
if(M>26) printf("Case #%d: -1\n",i);
else if(M==26) printf("Case #%d: 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n",i);
else if(M==25) printf("Case #%d: 60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n",i);
else if(M==24) printf("Case #%d: 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n",i);
else if(M==23) printf("Case #%d: 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n",i);
else printf("Case #%d: %d\n",i,g[M-1]);
}
}
return 0;
}