確定進位制 【C++與java】
阿新 • • 發佈:2018-12-21
描述
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; } }