百练OJ:2972: 确定进制
題目鏈接:
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;}}總結
以上是生活随笔為你收集整理的百练OJ:2972: 确定进制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java语言实现图的深度优先遍历
- 下一篇: ACM错误提示/错误原因