您的位置:首页 > 其它

进制思想

2012-11-14 09:36 106 查看
/article/9257616.html

第20题:字符串数组seq[] = a,b,c,d,aa,ba,ca,da,ab,bb,cb,db,ac...,aaa,baa,...

(1)aaa是第几个字符串

(2)ababacd是第几个
(3)第1000个字符串是什么

(4)编写函数find(),返回字符串在seq中是第几个(语言不限)

分析:

(1).长度,很容易推导出长度是n的字符串在第4^(n-1)个之后,aaa是1位和2位全排列后的第一个,即第4^(3-1)+4^(2-1)之后的第一个,也即第21个

(2)字符,每个字符可以判断出它之前的字符全排列了多少次,

字 符: a b a b a c d

全排列: 1 2 1 2 1 3 4

4^次幂: 0 1 2 3 4 5 6

即2*4^1+1*4^2+2*4^3+1*4^4+3*4^5+4*4^6 = 19864 (考场不让用计算器...换成2的次幂来算)

(3)把1000转为二进制是 11 11 10 10 00

他们分别对应4进制里的 3 3 2 2 0

对应字符就是 c c b b X,这里不好表示,先吧1000加个1

得到11 11 10 10 01,即c c b b a. 倒序就是abbcc,这里算出来的是1001的字符串

那第1000个是上一个, 即 abbcc-1 = dabcc

(4)可执行代码如下:

[cpp] view
plaincopy

#include <iostream>

#include <string>

using namespace std;

long find(char seq[]){

long sum=0;

long tmp=1;

int len = strlen(seq);

for (int i=0;i<len;i++)

{

sum+=(seq[i]-'a'+1)*tmp;

tmp*=4;

}

return sum;

}

int main(){

cout<<find("ababacd")<<endl;

cout<<find("abbcc")<<endl;

cout<<find("dabcc")<<endl;

cout<<find("aaa")<<endl;

cout<<find("a")<<endl;

return 0;

}

a b c d 代表权重 1 2 3 4

aaa 就是 1*4^0 + 1*4^1 + 1*4^2 = 21
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: