一、2972相邻数字的基数等比:确定进制
所谓基数等比就是后一个数与前一个数有倍数的关系。如 111 = 1 + 1 * 2(1 + 2 * 1);
给定 如 11 11 121 确定进制是3 和 10 ,只输出最小的进制,即3;
1 /* author :bakari 2 * 2-16进制的计算 3 * 特点:相邻数字的基数等比 4 * 规律:x1x2x3(任意进制) ---> d1d2d3(十进制)(进制为p) 5 * x1*p(k-1) + x2*p(k-2) + x3*p(k-3) = p(k-3)(x3p + x1*p(2)) = p(k-3)(p(x3 + x1*p)); 6 */ 7 #include <iostream> 8 #include <cstring> 9 using namespace std; 10 11 int const Max = 8; 12 13 long RanToTen(const char *x ,const int& b) //p代表进制 14 { 15 int nLen = strlen(x); 16 long ret = 0; 17 for (int i = 0; i != nLen; ++i){ 18 if ((x[i] - '0') >= b) return -1; 19 ret *= b; 20 ret += x[i] - '0'; 21 22 } 23 return ret; 24 } 25 26 int main() 27 { 28 char p[Max],q[Max],r[Max]; 29 long pa , qa , ra; 30 int n ; 31 cin >> n; 32 while(n--){ 33 int i; 34 cin >> p >> q >> r; 35 for (i = 2; i <= 16; ++i){ 36 pa = RanToTen(p,i); 37 qa = RanToTen(q,i); 38 ra = RanToTen(r,i); 39 if (-1 == pa || -1 == qa || -1 == ra) continue; 40 if (pa * qa == ra){ 41 cout << i <<endl; 42 break; 43 } 44 } 45 if (17 == i) cout<<"0"<<endl; 46 } 47 return 0; 48 }
二、2973相邻数字的基数不等比 :俗称skew数
给定如 10120 转换后为 1 * (2^5 - 1)+ 0 * (2^4 - 1)+ 1 * (2^3 - 1)+ 2 * (2^2 - 1)+0 * (2^1 - 1)
1 /* author:bakari 2 * 和一般进制转换不同,此进制基数不等比 3 * 第k位的值Xk = Xk * (2^(k+1) - 1) 4 * 令base[0] = 1;则:base[k] = 2^(k+1) - 1 = 2 * (2^k - 1) + 1 = 2 * base[k-1]+1; 5 */ 6 7 #include <iostream> 8 #include <cstring> 9 using namespace std; 10 11 const int MaxBit = 31; 12 int base[MaxBit]; 13 14 long int Transe(const char *x); 15 16 int main() 17 { 18 char str[MaxBit]; 19 base[0] = 1; 20 for (int i = 1; i != MaxBit; ++i) 21 base[i] = 2 * base[i-1] + 1; 22 while (1){ 23 cin >> str; 24 if (Transe(str) == 0) 25 break; 26 else cout << Transe(str) <<endl; 27 } 28 return 0; 29 } 30 31 long int Transe(const char *x) 32 { 33 int nLen = strlen(x); 34 long ret = 0; 35 if (strcmp(x,"0") == 0) return 0; 36 for (int i = 0,k = nLen - 1; i != nLen; ++i,--k){ 37 ret += (x[i] -'0') * base[k]; 38 } 39 return ret; 40 }
个人总结:多角度思考问题