现在的位置: 首页 > 综合 > 正文

进制思想

2019年04月19日 ⁄ 综合 ⁄ 共 1071字 ⁄ 字号 评论关闭

http://blog.csdn.net/twtsa/article/details/8055143

第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)可执行代码如下:

  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. long find(char seq[]){  
  6.     long sum=0;  
  7.     long tmp=1;  
  8.     int len = strlen(seq);  
  9.     for (int i=0;i<len;i++)  
  10.     {  
  11.         sum+=(seq[i]-'a'+1)*tmp;  
  12.         tmp*=4;  
  13.     }  
  14.     return sum;  
  15. }  
  16.   
  17. int main(){  
  18.     cout<<find("ababacd")<<endl;  
  19.     cout<<find("abbcc")<<endl;  
  20.     cout<<find("dabcc")<<endl;  
  21.     cout<<find("aaa")<<endl;  
  22.     cout<<find("a")<<endl;  
  23.     return 0;  
  24. }  

 a b c d 代表权重 1 2 3 4 
aaa 就是 1*4^0 + 1*4^1 + 1*4^2 = 21

【上篇】
【下篇】

抱歉!评论已关闭.