這個題自己寫了寫 發現自己代碼能力真是太弱了。 題目很簡單。 就是兩種進制轉換,轉來轉去。。
滿27進1 留1 差不多就是這樣。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cmath>
#include <iomanip>
#include <cmath>
typedef long long LL;
typedef unsigned long long LLU;
const double PI=acos(-1.0);
using namespace std;
#define MAXN 100000+10
#define INF 1 << 30
int _pow(int a, int b){
int t = 1;
for(int i = 0; i < b; i++)
t *= a;
return t;
}
int main (){
int n;
scanf("%d",&n);
while(n--){
char s[MAXN];
int r,c;
scanf("%s",s);
int flag = 0;
int ll = strlen(s);
for(int i = 0; i < ll; i++)
if(s[i] == 'C')
flag = 1;
if(s[0] == 'R' && s[1]>= '0' && s[1] <= '9' && flag){
sscanf(s+1,"%d",&r);
int len = strlen(s);
for(int i = 2; i < len; i++)
if(s[i] == 'C' && s[i+1] >= '0' && s[i+1] <= '9'){
sscanf(s+i+1,"%d",&c);
break;
}
int m[10] = {0};
while(c >= 27){
m[1] ++;
m[0] ++;
c -= 27;
}
m[0] += c;
for(int i = 0; i <= 4; i++){
while(m[i] >= 27){
m[i+1] ++;
m[i] ++;
m[i] -= 27;
}
}
for(int i = 5; i >= 0; i--){
if(m[i] != 0)
printf("%c",m[i]-1 + 'A');
}
printf("%d\n",r);
}
else{
int len = strlen(s);
int sum = 0;
char ss[MAXN];
int i; int r = 0;
for(i = 0; i < len; i++){
if(s[i] >= 'A' && s[i] <= 'Z')
ss[i] = s[i];
else {
sscanf(s+i,"%d",&r);break;
}
}
ss[i] = '\0';
int l = strlen(ss);
int c = 0;
for(i = l-1; i >= 0; i--){
c += (ss[i]-'A'+1)*_pow(26,(l-i-1));
}
printf("R%dC%d\n",r,c);
}
}
return 0;
}
還是理解的不透徹。 sscanf 可以用 %*c 來讀取沒用的字符串。 然後 sscanf 返回值的使用。 真是出神入化。 順帶 遞歸輸出。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
void g(int t)
{
if(t)
{
g((t-1)/26);
putchar(65+(t-1)%26);
}
}
int main()
{
int n,x,y;
char s[64],*p;
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++)
{
gets(s);
if(sscanf(s,"%*c%d%*c%d",&x,&y)==2)
{
g(y);
printf("%d\n",x);
}
else
{
for(x=0,p=s;*p>64;p++)
x=x*26+*p-64;
printf("R%sC%d\n",p,x);
}
}
return 0;
}