nyoj 303 序號互換 第四屆河南省程序設計大賽

序號互換

時間限制:1000 ms  |  內存限制:65535 KB
難度:2
描述

Dr.Kong設計了一個聰明的機器人卡多,卡多會對電子表格中的單元格座標快速計算出來。單元格的行座標是由數字編號的數字序號,而列座標使用字母序號。觀察字母序號,發現第1列到第26列的字母序號分別爲A,B,…,Z,接着,第27列序號爲AA,第28列爲AB,依此類推。

若給Dr.Kong的機器人卡多一個數字序號(比如32),它能很快算出等價的字母序號(即AF),若給機器人一個字母序號(比如AA),它也能很快算出等價的數字序號(27),你能不能與卡多比試比試,看誰能算得更快更準確。

輸入
第一行: N 表示有多少組測試數據。 
接下來有N行, 每行或者是一個正整數,或者是一個僅由大寫字母組成的字符串。
輸入保證,所有數字序號和字母序號對應的數字序號均 ≤ 2*10^9
輸出
對於每一行測試數據,輸出一行。如果輸入爲一個正整數序號,則輸出等價的字母序號;如果輸入爲字符串,則輸出等價的數字序號。
樣例輸入
3
27
G
AA
樣例輸出
AA
7
27
來源
第四屆河南省程序設計大賽


// 進制轉換思想 
#include<stdio.h>
#include<string.h>
char s[10], b[10];
int pow(int i){ //計算次方 
	 int sm=1;
	 while(i--)
	 	sm=26*sm; 
	 return sm;
}
int main(){
	 int t,n;
	 scanf("%d",&t);
	 while(t--){
		  scanf("%s",s);
		  memset(b,0,sizeof(b));
		  n=strlen(s);
		  if(s[0]>='0'&&s[0]<='9') { //判斷是否是數字 
			   int num=0;
			   for(int i=0;i<n;i++)
			   		num=num*10+s[i]-'0';//轉換成數字 
			   int k=0;
			   while(num){ 
				    if(num%26==0){//如果餘數是 0 代表的是 Z 
					     b[k++]='Z';
					     num=num/26-1;
				    }
				    else { // A ~ Y 餘數對應 1 ~ 25 
					     b[k++]=num%26+64;
					     num/=26;
				    }  
			   }
			   b[k]='\0'; //字符串結束 
			   for(int i=k-1;i>=0;i--)
			  		printf("%c",b[i]);
			   puts(""); //逆序輸出,換行 
		  }
		  else { // 輸入是字符串 
			   int sum=0;
			   int c=n-1;
			   for(int i=0;i<n;i++) //位數越高,對應的次方越低 
			       sum=sum+pow(c-i)*(s[i]-64);
		   	   printf("%d\n",sum);
		  }  
	 }
	 return 0;
}



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