相邻数字的基数等比:确定进制
2016-06-15 00:51
246 查看
问题描述
6 X 9 =42 对于十进制来说是错误的,但是对于二进制来说是正确的。即6(13) X 9(13) = 42(13),而42(13) = 4 X 13^1 + 2 X 13^0 = 54(10)。你的任务就是写一段程序读入3个整数p、q 和 r,然后确定一个进制B(2<=B<=16)使得p X q = r。如果B有很多选择,输出最小的一个。例如:p=11,q=11,r=121。则有11(3) X 11(3) = 121(3),因为11(3) = 1 X 3^1 + 1 X 3^0 = 4(10) 和 121(3) = 1 X 3^2 + 2 X 3^1 +1 X 3^0 = 16(10)。对于十进制,有11(10) X 11(10) = 121(10)。这种情况下,应该输出3。如果没有合适的进制,则输出0。
输入数据
输入有T组测试样例。T在第一行给出。每一组测试样例占一行,包含3个整数p、q、r。p、q、r的所有位都是数字,并且1<=p、q、r<=1 000 000。
输出要求
对于每个测试样例输出一行。该行包含一个整数:即使得p x q = r成立的最小的B。如果没有合适的B,则输出0.
输入样理
3
6 9 42
11 11 121
2 2 2
输出样例
13
3
0
解题思路
此问题很简单。选择一个进制B,按照该进制将被乘数、乘数、乘积分别转换成十进制,然后判断等式是否成立。使得等式成立的最小B就是所求的结果。
分别用一个字符型数组存储p、q、r 的各位数字字符。先以字符串的方式读入p、q、r,然后按不同的进制将它们转换成十进制数,判断是否相等。
参考程序
常见错误
6 X 9 =42 对于十进制来说是错误的,但是对于二进制来说是正确的。即6(13) X 9(13) = 42(13),而42(13) = 4 X 13^1 + 2 X 13^0 = 54(10)。你的任务就是写一段程序读入3个整数p、q 和 r,然后确定一个进制B(2<=B<=16)使得p X q = r。如果B有很多选择,输出最小的一个。例如:p=11,q=11,r=121。则有11(3) X 11(3) = 121(3),因为11(3) = 1 X 3^1 + 1 X 3^0 = 4(10) 和 121(3) = 1 X 3^2 + 2 X 3^1 +1 X 3^0 = 16(10)。对于十进制,有11(10) X 11(10) = 121(10)。这种情况下,应该输出3。如果没有合适的进制,则输出0。
输入数据
输入有T组测试样例。T在第一行给出。每一组测试样例占一行,包含3个整数p、q、r。p、q、r的所有位都是数字,并且1<=p、q、r<=1 000 000。
输出要求
对于每个测试样例输出一行。该行包含一个整数:即使得p x q = r成立的最小的B。如果没有合适的B,则输出0.
输入样理
3
6 9 42
11 11 121
2 2 2
输出样例
13
3
0
解题思路
此问题很简单。选择一个进制B,按照该进制将被乘数、乘数、乘积分别转换成十进制,然后判断等式是否成立。使得等式成立的最小B就是所求的结果。
分别用一个字符型数组存储p、q、r 的各位数字字符。先以字符串的方式读入p、q、r,然后按不同的进制将它们转换成十进制数,判断是否相等。
参考程序
include<stdio.h> include<string.h> long b2ten(char* x, int b){ //x字符数组值,b进制的参数,功能是b进制转换为十进制数ret int ret = 0; int len = strlen(x); for(int i = 0; i < len; i++){ if (x[i] - '0' >= b) return -1; ret *= b; ret +=x[i] - '0'; } return (long)ret; } void main(){ int n; char p[8],q[8],r[8]; long pAlgorism, qAlgorism, rAlgorism; scanf("%d",&n); while(n--){ scanf("%s%s%s",p,q,r); for(int 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"); } }
常见错误
1. 在数制b(2<=b<=16)的表示中,每一位上的数字一定都比b小。每读入一组数据后,需要根据其中的数字,判断b的下限。在参考程序的b2ten 函数中,如果字符串x中存储的数字比b大、或者与b相等,则返回-1,表明:按照数制b,x中存储的表示形式是非法的,因此b不可能是所求的值。 2. 检查:在为找到合适的 b 时,是否输出0。
相关文章推荐
- 内存四区笔记
- px4开发指南——linux下qgroundcontrol地面站安装
- 内存四区笔记
- CSDN code 心得
- 第三次C语言课程设计作业
- C语言小项目--贪吃蛇游戏
- 网络篇——android中的Http(一)之Http协议基础
- 《数值分析》总结
- Linux字符串函数集
- win2008 R2中安装MySQL出现ODBC连接器安装错误
- Linux access
- Linux(Ubuntu)下面SecureCRT 完全破解
- ajax 的 async属性
- Android App 性能优化之图片优化
- pycharm快捷键
- C-链表
- akira之修改linux 3.6.8内核并添加系统调用
- 串口数据异常,数据段获取到两段或者三段
- win7与virtualbox安装的ubuntu系统资源相互访问
- leetcode_c++:Majority Element(169)