noj 303 序号互换 (第四届河南省程序设计大赛)

进制转换问题,这里进位是直接从Z 到A 的,如果前一位是ZZZ则下一位是AAAA要特别处理一下n是26的倍数的地方,其他的与进制转换相同

做这道题的感受:这道题实在是算不上是难题,平时也就罢了,但是在比赛的时候很有可能把这道题作为首选的题,一开始做题一定要重视,像我,一开始觉得它很简单就直接上去敲代码,结果一直wr,搞得我对自己的能力产生强烈怀疑,但是比赛一结束我马上思路就清晰了,抗压能力差的人还是要按照老规矩,先用手写再上去敲代码,当然不如果这道题对你来说像1+1=2那么简单,直接敲也没关系的

代码:

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
char c[27];
char str[50];
char b[50];
int l;
long n;
void init()
{
 int i;
 c[0]='Z';
 c[1]='A';
 for(i=2;i<27;i++)
  c[i]=c[i-1]+1;
}
void getnun()
{
 int i;
 n=0;
 int t;
 for(i=l-1;i>=0;i--)
 {
  t=str[i]-'0';
  n+=t*(int)pow(10,l-i-1);
 }
}
void charngenum()
{
 int i;
 n=0;
 int t;
 for(i=l-1;i>=0;i--)
 {
  t=str[i]-64;
  n+=t*(int)pow(26,l-i-1);
 }
 cout<<n<<endl;
}
int main()
{
 int t;
 int len;
 int i;
 int r;
 cin>>t;
 init();
 while(t--)
 {
  cin>>str;
  l=strlen(str);
  if(str[0]<='9')
  {
   getnun();
   len=0;
   while(n>0)
   {
    if(n<=26)
    {
     b[len]=c[n];
     len++;
     break;
    }
    if(n%26==0)
    {
     b[len]=c[0];
     len++;
     n/=26;
     n--;
     continue;
    }
    else
    {
     r=n%26;
     b[len]=c[r];
     len++;
     n/=26;
    }
   }
   for(i=len-1;i>=0;i--)
    cout<<b[i];
   cout<<endl;
  }
  else
  {
   charngenum();
  }
 }
 return 0;
}

你可能感兴趣的:(c)