前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >百炼OJ 2972 2973

百炼OJ 2972 2973

作者头像
Linux云计算网络
发布2018-01-10 18:35:04
6220
发布2018-01-10 18:35:04
举报
文章被收录于专栏:Linux云计算网络Linux云计算网络

一、2972相邻数字的基数等比:确定进制

     所谓基数等比就是后一个数与前一个数有倍数的关系。如 111 = 1 + 1 * 2(1 + 2 * 1);

     给定 如 11 11 121 确定进制是3 和 10 ,只输出最小的进制,即3;

代码语言:javascript
复制
 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)

代码语言:javascript
复制
 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 }

个人总结:多角度思考问题

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-08-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档