[PAT Basic] 1022.D进制的A+B
Posted 47pineapple
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PAT Basic] 1022.D进制的A+B相关的知识,希望对你有一定的参考价值。
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进制就可以了
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 }
以上是关于[PAT Basic] 1022.D进制的A+B的主要内容,如果未能解决你的问题,请参考以下文章