学校算法作业(五)——确定进制(超级水题)

  无比烦躁的一个下午,没有网络进不去评测系统……虽然今天是教师节,但我还是很反感这位老师。由于心情原因一节课都没在听,所以布置的题目也没认真看。以为会很麻烦,结果发现是道水题……

下面是题目(网都没有题目肯定是现扒的)

  随手截的图,见谅:

  

  这道题题目叨叨叨叨了一大堆废话,说白了就是给你三个数,让你试试在(2~16)进制内前两个乘起来等不等于第三个数。由于数据无比的小,所以直接暴力吧/

说一下思路:

  选择一个进制B,按照该进制将被p、q、r分别转换成十进制。然后判断等式是否成立。使得等式成立的最小B就是所求的结果。

  那么如写进制转换这一部分呢?我们调几个典型的进制转换看看:

   二进制转十进制

    方法:
    将二进制数从低位到高位计算(右边为低位),第0位的权值是2的0次方,第1位的权值是2的1次方,依次类推。 二进制就是逢二进1,二进制数采用0和1表示一个数。
   例如将(1100100)B转换成十进制

第0位 0 x 2^0 = 0;
第1位 0 x 2^1 = 0;
第2位 1 x 2^2 = 4;
第3位 0 x 2^3 = 0;
第4位 0 x 2^4 = 0;
第5位 1 x 2^5 = 32;
第6位 1 x 2^6 = 64;

读数,把结果值相加,0+0+4+0+0+32+64=100,即(1100100)B=(100)D。

  

  八进制转十进制
   方法:
    同二进制计算一样,从低位到高位,权值是8的n次方,第0位的权值是8的0次方,第1位的权值是8的1次方,依次类推。八进制就是逢8进1,八进制数采用 0~7这八数来表达一个数。
   例如将(144)O转化成十进制

第0位 4 x 8^0 = 4;
第1位 4 x 8^1 = 32;
第2位 1 x 8^2 = 64;

读数,把结果值相加,4+32+64=100,即(144)O=(100)D。

  

  十六进制转十进制
   方法:
    同二进制计算一样,从低位到高位,权值是16的n次方,第0位的权值是16的0次方,第1位的权值是16的1次方,依次类推。十六进制就是逢16进1,十六进制的16个数为0123456789ABCDEF。
   例如将(64)H转化成十进制

第0位 4 x 16^0 = 4;
第1位 6 x 16^1 =96;

读数,把结果值相加,4+96=100,即(64)H=(100)D。

  是不是,感觉很莫名其妙,其实你认真看完就会发现,所谓的进制转换就是将各个位置上的数乘以他们的权值然后相加。到了这里代码的雏形就出来了

我来贴一下代码:

  能写出来,有思路的先自己写

long conversion(char *str, int b)
{
    int res = 0;

    for (int i = 0; str[i] != '\0'; i++)
    {
        if (str[i] - '0' >= b)//一但发现大于等于b,直接返回
        {
            return -1;
        }
        res *= b;
        res += str[i] - '0';
    }
    return res;
}
进制转换

  进制转换这个核心写完了就很简单了,写个循环,题目说从2~20进制,那就写一个从2~20的循环,调用上面那个函数,在进行判断,完事。

贴代码:

  

#include <stdio.h>
#define DEBUG 0    

long conversion(char *str, int b);

int main()
{
    int n, b;
    char p[8], q[8], r[8];
    long Decimalp, Decimalq, Decimalr;
    scanf("%d", &n);
    while (n--)
    {
        scanf("%s%s%s", &p, &q, &r);
        for (int i = 2; i <= 20; i++)
        {
            Decimalp = conversion(p, i);
            Decimalq = conversion(q, i);
            Decimalr = conversion(r, i);
#if DEBUG
            printf("%d %d %d\n", Decimalp, Decimalq, Decimalr);
#endif //
            if (Decimalp == -1 || Decimalq == -1 || Decimalr == -1)
                continue;
            if (Decimalp * Decimalq == Decimalr)
            {
                printf("%d\n", i);
                break;
            }
            b = i;
        }

        if (b == 20)
        {
            printf("0\n");
        }
    }
    return 0;
}

long conversion(char *str, int b)
{
    int res = 0;

    for (int i = 0; str[i] != '\0'; i++)
    {
        if (str[i] - '0' >= b)
        {
            return -1;
        }
        res *= b;
        res += str[i] - '0';
#if DEBUG
        printf("%d\n", res);
#endif
    }
#if DEBUG
    printf("\n");
#endif
    return res;
}
完整代码

切记切记,先自己写,在点开看

猜你喜欢

转载自www.cnblogs.com/daker-code/p/11499113.html
今日推荐