百练OJ:2972: 确定进制

来源:互联网 发布:思迅软件知识库 编辑:程序博客网 时间:2024/06/05 09:27

题目链接:

http://bailian.openjudge.cn/practice/2972/

描述: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。
输入:一行,包含三个整数p、q、r,相邻两个整数之间用单个空格隔开。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。
输出:一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。

样例输入
    6 9 42
样例输出
    13

解题思路:

本题的解题思路主要是一个枚举的方法,对于2-16进制的数转为十进制的数,让后进行一次判断,知道判断成功为止。需要注意的是:例如121这个数是不能转换为二进制的,所以要判断进制数不可低于数字中包含的数。可以发现:11(2) * 11(2) = 121(2)  ,如果不加以判断,势必导致结果错误

解题代码:

import java.util.Scanner;public class Main {public static void main(String[] args) {// TODO Auto-generated method stubScanner input =new Scanner(System.in);int p=input.nextInt();int q=input.nextInt();int r=input.nextInt();int c=0;for(int i=2;i<=16;i++){int p1=getNum(p,i);int q1=getNum(q,i);int r1=getNum(r,i);//System.out.println( i+"进制"+p1+" "+q1+" "+r1);if(p1*q1==r1 && p1!=0 && q1!=0 && r1!=0){c=i;break;}}System.out.println(c);}private static int getNum(int p, int i) {String str=String.valueOf(p);int sum = 0;for(int j=0;j<str.length();j++){int num=str.charAt(j)-48;if(num>=i){sum=0;break;}else{sum+=num* Math.pow(i,str.length()-1-j);}}return sum;}}


原创粉丝点击