24h購物| | PChome| 登入
2009-07-01 13:47:21| 人氣853| 回應0 | 上一篇 | 下一篇

ACM 619 Numerically Speaking

推薦 0 收藏 0 轉貼0 訂閱站台

作法:大數!

想法:

1.若給數字則轉成26進位 0→Z 1→A 2→B ...以此類推 (大數26進位)

2.若給單字,則...首先m=單字長度好了

從頭開始判斷
掃到英文單字第1個 '?' 假次?=e 那麼 就是ans=ans+5*26^(m-1);
掃到英文單字第2個 '?' 假次?=a 那麼 就是ans=ans+1*26^(m-2);
....以次類推

/********************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char x[30]={0};
void num(char str[])
{
  unsigned long long int n=0;
  int a,b,c,m=strlen(x);
  int xx[50]={0};
  for(a=m-1,b=0;a>=0;a--,b++) xx[b]=str[a]-48;
  unsigned long long int ss[100]={0};
  for(a=0;a<100;a++)
     {
       int temp[50]={0};
       for(b=48;b>=0;b--)
        {
          temp[b]=(xx[b]+xx[b+1]*10)/26;
          xx[b]=(xx[b]+xx[b+1]*10)%26;
        }
       ss[a]=xx[0];
       for(b=48;b>=0;b--) xx[b]=temp[b];
     }
  for(a=100;a>=0;a--) if(ss[a]!=0) break;
 int temp=a+1,aa=a;
  if(ss[0]==0) {aa--;ss[aa]=0;}
 for(a=aa;a>=0;a--)
   if(ss[a]==0) printf("z");
   else printf("%c",ss[a]+'a'-1);
 for(a=0;a<22-temp;a++) printf(" ");
 int flag=3-(m-m/3*3);
 if(flag==3) flag=0;
 for(a=0;a<m;a++,flag++)
    {
      if(flag==3&&a!=m-1) {flag=0;printf(",");}
        printf("%c",str[a]);
    }
  printf("\n");
}
void word(char str[])
{
  int a,b,c,m=strlen(x),bign[101]={0};
  int t[101]={0};
  t[0]=1;
  printf("%s",x);
  for(a=0;a<22-m;a++) printf(" ");
  for(a=m-1;a>=0;a--)
   {
     int temp=str[a]-'a'+1;
     for(b=0;b<100;b++)
        {
           bign[b]+=(temp*t[b]);
           bign[b+1]+=(bign[b]/10);
           bign[b]%=10;
        }
     for(b=0;b<99;b++)  t[b]*=26;
     for(b=0;b<99;b++)
      if(t[b]>=10) {t[b+1]=t[b+1]+t[b]/10;t[b]%=10;}
      else break;
   }
  for(b=99;b>=0;b--)
   if(bign[b]!=0)
    {
       int flag=3-((b+1)-(b+1)/3*3);
       if(flag==3) flag=0;
       for(a=b;a>=0;a--,flag++)
          {
              if(flag==3&&a!=0) {flag=0;printf(",");}
              printf("%d",bign[a]);
           }
        printf("\n");
        break;
    }
}
main()
{
 while(scanf("%s",x)==1&&x[0]!='*')
   if(x[0]<=57&&x[0]>=48)    num(x);
   else word(x);
 return 0;
}

台長: 來源不明
人氣(853) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
此分類下一篇:ACM 10297 Q10297: Beavergnaw
此分類上一篇:ACM 10009 10009 - All Roads Lead Where?

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文