zoukankan      html  css  js  c++  java
  • 相邻数字的基数等比确定进制问题pojg2972

       解决数制转换问题时,如果所给的数值不是用十进制表示的,一般用一个字符型数组来存放,数组的每个元素分别存储它的一位数字。然后按位转换求和,得到十进制表示,再把十进制转成成其他所求的进制表示。转成的结果也用一个字符型数组表示。

    根据数制表示中相邻位的基数关系,可以把不同的数制分成2类:一类数制表示中相邻位的基数是等比关系,如十进制表示。另一类相邻位的基数是不等比的。如时间表示中

    2927:确定进制:

    描述6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13), 而 42(13) = 4 * 131 + 2 * 130 = 54(10)。 你的任务是写一段程序读入三个整数p、q和 r,然后确定一个进制 B(2<=B<=16) 使得 p * q = r. 如果 B有很多选择, 输出最小的一个。例如: p = 11, q = 11, r = 121. 则有 11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 31 + 1 * 30 = 4(10) 和 121(3) = 1 * 32 + 2 * 31 + 1 * 30 = 16(10)。 对于进制 10,有 11(10) * 11(10) = 121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。 

    输入
    输入有 T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。
    输出
    对于每个测试样例输出一行。该行包含一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。

    注意审题:2<=b<=16;

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    long b2ten(char *x,int b)
    {
        int ret=0;
         
        int len=strlen(x);
        int base;
    for(int i=len-1;i>=0;i--) { if(x[i]-'0'>=b) return -1; //还要判断是否超过b, if(i==len-1) base=1; else base*=b; ret+=base*(x[i]-'0');
    //最开始写的是ret+=base*x[i];结果调试时发现输入为6时,ret=54;想了了base是int型,x[i]为char类型,int与char类型相乘
    结果是用char型的asci码和int相乘,结果是int型的。于是把要把它转成int的。想到用atoi函数,但是提示错误:
    atoi(const char* )与char不匹配,原来atoi是针对字符串的,不能针对字符的,如何把char转成int,减去‘0’就可以了
        } 
    return (long)ret;
    }

    int main()
    {
        int nCases;
        scanf("%d",&nCases);
        char p[8],q[8],r[8];
        long p1,q1,r1;
        int b;
        for(int i=0;i<nCases;i++)
        {
            scanf("%s%s%s",p,q,r);
             
             for(b=2;b<=16;b++)
             {
                 p1=b2ten(p,b);
                  
                 q1=b2ten(q,b);
                 r1=b2ten(r,b);
    
                 if(p1==-1||q1==-1||r1==-1) continue;
                 if(p1*q1==r1)
                 {
                     printf("%d
    ",b);
                     break;
                 }
                  
             }
             if(b==17) printf("0
    ");
             
        }
         
    }

    上面的b2ten非常好理解,是从最低位开始求和的。我们也可以从最高位开始求。例如:

    211,我们先求

    ret=0*10+2;

    在2*10+1=21;

    再ret=21*10+1=211;

    说明从高位往地位求和也可以。

    long b2ten2(char *x,int b)
    {
        int ret=0;
        int len=strlen(x);
        for(int i=0;i<len;i++)
        {
            if(x[i]-'0'>=b) return -1;
            ret*=b;
            ret+=x[i]-'0';
        }
        return (long)ret;
    }

     这种方式更加好。

  • 相关阅读:
    重置主键自增
    tp5引入第三方类库
    判断浏览器是否是手机端
    网站二级域名的配置
    阿里云服务器php环境的搭建
    备忘录——二维码
    (3) 编写一个截取字符串的函数,输入一个字符串和字节数,输出按字节书截取的字符串,但是要保证汉字不能截半个
    (2) 假设字符串类似这样的aba和aab就相等,现在随便给你二组字符串,请编程比较他们看是否相等
    (1) 一个字符串,根据输入参数m,找出字符串的m个字符的所有字符串
    Windows下MySQL双向同步及环形同步的实现
  • 原文地址:https://www.cnblogs.com/youxin/p/3232621.html
Copyright © 2011-2022 走看看