PAT 乙级 1022.D进制的A+B C++/Java
1022 D进制的A+B (20 分)
输入两个非负 10 进制整数 A 和 B (≤),输出 A+B 的 D (1)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103
进制转换(P进制转Q进制):
步骤:
1. 将P进制数转成10进制
给定一个2进制数1011,将其转成10进制: $1*10^3 + 1*10^2 +0*10^1+1*10^0$ = 11
C++:
1 // P进制转10进制 2 int PtoTen(int x, int P) 3 { 4 int result = 0; 5 int product = 1; 6 while (x != 0) 7 { 8 result = result + (x % 10) * product; 9 x = x / 10; 10 product = product * P; 11 } 12 return result; 13 }
2.将10进制数转成Q进制
采用“除基(Q)取余法”
给定一个10进制数:17,将其转成2进制
17 / 2 = 8, 余1
8 / 2 = 4 余0
4 / 2 = 2 余0
2 / 2 = 1 余0
1 / 2 = 0 余1
计算结束
接着将余数从后往前(从下往上)输出,得到的10001就是17的二进制数
C++:
1 // 10进制转Q进制 2 void tenToQ(int x, int Q) 3 { 4 vector<int> left; //保存余数 5 do 6 { 7 left.push_back(x % Q); 8 x /= Q; 9 } while (x != 0); 10 //反向输出余数 11 for (auto it = left.rbegin(); it != left.rend(); ++it) 12 { 13 cout << *it; 14 } 15 }
注意:用do while是因为,如果10进制数恰好等于0,应该输出余数0,如果是while循环,则不会保存余数
题目分析:
将A和B相加,再按照上面的内容转化成D进制就可以了
C++实现:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 void tenToQ(int x, int Q) 6 { 7 vector<int> left; 8 do 9 { 10 left.push_back(x % Q); 11 x /= Q; 12 } while (x != 0); 13 14 for (auto it = left.rbegin(); it != left.rend(); ++it) 15 { 16 cout << *it; 17 } 18 } 19 20 int main() 21 { 22 int A, B, D; 23 cin >> A >> B >> D; 24 tenToQ(A + B, D); 25 return 0; 26 }
Java实现:
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner in = new Scanner(System.in); 6 int a = in.nextInt(); 7 int b = in.nextInt(); 8 int d = in.nextInt(); 9 in.close(); 10 int sum = a + b; 11 String s = ""; 12 int t = 0; 13 if(sum == 0){ 14 System.out.print(sum); 15 } 16 while(sum > 0){ 17 t = sum % d; 18 sum = sum / d; 19 s = t + s; 20 } 21 System.out.print(s); 22 } 23 }