数值转换问题(一)相邻数字的基数等比:确定进制

数值转换问题(一)

相邻数字的基数等比:确定进制

*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。

代码
#include <stdio.h>
#include <string.h>
long b2ten( char*x, int b) //x字符数组值,b进制的参数,功能是b进制转换为十进制数
{
int ret=0;
int len=strlen(x); //得到字符串的长度
for(int i=0;i<len;i++)
{
if(x[i]-‘0’>=b) //判断是否比b大
return -1;
ret = b;
ret += x[i] -‘0’;
}
return (long) ret;
}
int main(int argc, char
argv[])
{
int n;
char p[8], q[8], r[8];
long pAlgorism, qAlgorism , rAlgorism;
int b;
scanf("%d",&n);
while( n–)
{
scanf("%s%s%s",p,q,r);
for( b = 2; b <= 16; b++)
{
pAlgorism = b2ten(p,b);
qAlgorism = b2ten(q,b);
rAlgorism = b2ten(r,b);
if( pAlgorism == -1 || qAlgorism == -1 || rAlgorism == -1)continue;
if( pAlgorism * qAlgorism == rAlgorism)
{
printf("%d\n",b);
break;
}
}
if( b == 17)printf(“0\n”);
}
return 0;
}
解题思路
(1)选择一个进制b,按照该进制将被乘数、乘数、乘积分别转换成十进制。然后判断等式是否成立。使得等式成立的最小B就是所求的结果。
(2)分别用一个字符型数组存储p、q、r的各位数字符号。先以字符串的方式读入p、q、r,然后按不同的进制将它们转换成十进制数,判断是否相等。
总结
(1)最刚开始可以理解解题思路,但是想了很久也没有看懂代码,所以我通过查词来帮助理解。
ret:子程序的返回指令;从堆栈中退出pc的高8位和低8位字节,把堆栈指针减2,从pc值处开始继续执行程序。不影响任何标志。
堆栈: 一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。
strlen: strlen()是函数,是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。
strlen与sizeof: strlen() 函数计算的是字符串的实际长度,遇到第一个’\0’结束。而sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数。
len: len函数功能是返回文本串的字符数。Len():得到字符串的长度。语法是Len (string),string类型变量返回值Long。
Algorism: 十进位计数法,在代码中只是命名方便理解。
(2)单个字符转换为数字的方法是int(char[i]-‘0’);

猜你喜欢

转载自blog.csdn.net/m0_45128748/article/details/91074550
今日推荐