相邻数字的基数等比确定进制问题pojg2972

2020-09-26 14:01发布

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

根据数制表示中相邻位的基数关系,可以把不同的数制分成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\n",b);
                 break;
             }
              
         }
         if(b==17) printf("0\n");
         
    }
     
}

上面的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;
}

 这种方式更加好。

 

标签: