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

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

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

  随手截的图,见谅:

  

  这道题题目叨叨叨叨了一大堆废话,说白了就是给你三个数,让你试试在(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。

  是不是,感觉很莫名其妙,其实你认真看完就会发现,所谓的进制转换就是将各个位置上的数乘以他们的权值然后相加。我用的不是这种方法,让我们来思考一下

  例如:  

10进制的 8421,是不是等价于 8*10^3 + 4*10^2 + 2*10^1 + 1*10^0;
     8421是不是也等价于 1+(2+(4+(8+0)*10)*10)*10    \
我忘记这种因式分解叫什么了
    while(条件)
    {
      x *= 10;
      x += str[i] - '0';
    }

  那么我们是不是可以少写一个幂函数。

我来贴一下代码:

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

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;
}
完整代码

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值