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