ACM 619 Numerically Speaking
作法:大數!
想法:
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;
}