1. 程式人生 > >確定進位制 【C++與java】

確定進位制 【C++與java】

描述

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

程式碼:

此程式碼參考大佬部落格:

#include<iostream>
using namespace std;
int judge(int x,int B)
{
	int value=1,num=0;
	while(x!=0)///將一個數化為B進位制數
	{
		if((x%10)>=B)///B進位制下不可能出現大於等於B的數位
			return -1;
		num+=((x%10)*value);///value是每位的權值
		value*=B;///通過每次乘以B,移動B進位制的數位
		x/=10;///通過除10找出每一位
	}
	return num;
}
int main()
{
	int a,b,c;
	int i;
	cin>>a>>b>>c;
	for(i=2;i<=16;i++)///列舉2-16進位制
		if(judge(a,i)*judge(b,i)==judge(c,i))///找到使a*b=c成立的最小進位制B
		{
			cout<<i<<endl;
			return 0;
		}
	cout<<0<<endl;
	return 0;
}
 

java實現:

 此程式碼本菜雞通過參考大佬部落格實現:(ps):具體解析在C++中已有標註

import java.util.Scanner;

public class Main{
	public static void  main(String[]args) {
		Scanner in=new Scanner(System.in);
		int a=in.nextInt();
		int b=in.nextInt();
		int c=in.nextInt();
		boolean flag=true;
		for(int i=2;i<=16;i++) {
			if((judge(a,i)*judge(b,i))==judge(c,i)) {
				System.out.println(i);
				flag=false;
				break;
			}
		}
		if(flag)
		System.out.println(0);
	}
	public static  int judge(int x,int B) {
		int value=1,num=0;
		while(x!=0) {
			if((x%10)>=B) {
				return 99999;
			}
			num+=((x%10)*value);
			value*=B;
			x/=10;
		}
    return num;
	}
	
}