无比烦躁的一个下午,没有网络进不去评测系统……虽然今天是教师节,但我还是很反感这位老师。由于心情原因一节课都没在听,所以布置的题目也没认真看。以为会很麻烦,结果发现是道水题……
下面是题目(网都没有题目肯定是现扒的)
随手截的图,见谅:
![](https://i-blog.csdnimg.cn/blog_migrate/8a05dc4b14e8ca45fc635e5bb776c2e7.png)
这道题题目叨叨叨叨了一大堆废话,说白了就是给你三个数,让你试试在(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;
}
切记切记,先自己写,在点开看