思路:
開始看錯題了,以為最多只有兩個字母。
字母轉數字的表示式很容易看出來是:(26^(n-1))*(s[0]-64)+(26^(n-2))*(s[1]-64)+……
主要是數字怎麼轉字母,這應該是個數學問題。可是我想了好久沒想出好方法,數學太差了吧。最好只好想個笨點的方法ac掉了。
我的方法:
用 mi[i][j]表示從後面數第i位上是字母j的最小值。
用 ma[i][j]表示從後面數第i位上是字母j的最大值。
(1<=i<10 1<=j<=26 j=1時,即『a』)
例如: mi[3][4]="daa"轉成數字。 ma[3][4]="dzz"轉成數字。
這樣算出來後,數字轉字母,就可以從高位遞迴出字母來。
假設,給的數字是x。
如果mi[i][j]<=x<=ma[i][j],那麼可以知道轉化後的位數是i,且第i位是(char)(j+64);
根據前面推出的字母轉數字的公式。
x-=(26^(i-1))*j
遞迴即可求出所有序列。
#include #include using namespace std;
long long ma[11][30],mi[11][30];
long long pow(int a,int b)
return x;
}long long zimu(string s)
} }}int main(int argc, char *ar**)
{ long long t,i,j,n,x;
string s;
init();
cin>>t;
while(t--)
{ cin>>s;
if(s[0]>='0'&&s[0]<='9')
{ for(x=i=0;i
nyist 303 序號互換
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述dr.kong設計了乙個聰明的機械人卡多,卡多會對電子 中的單元格座標快速計算出來。單元格的行座標是由數字編號的數字序號,而列座標使用字母序號。觀察字母序號,發現第1列到第26列的字母序號分別為a,b,z,接著,第27列序號為aa...
303 序號互換
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 dr.kong設計了乙個聰明的機械人卡多,卡多會對 電子 中的單元格座標快速計算出來。單元格的行座標是由數字編號的數字序號,而列座標使用字母序號。觀察字母序號,發現第1列到第26列的字母序號分別為a,b,z,接著,第27列序號為...
南陽 303序號互換
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 dr.kong設計了乙個聰明的機械人卡多,卡多會對 電子 中的單元格座標快速計算出來。單元格的行座標是由數字編號的數字序號,而列座標使用字母序號。觀察字母序號,發現第1列到第26列的字母序號分別為a,b,z,接著,第27列序號為...