HDU 4541 Ten Googol

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
 

Input
輸入數據第一行有一個數字T,代表有T組數據。
每組數字由兩個正整數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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章