河北大学程序设计训练营

[TOC]

day16每日一题讲解

题目:

2-2 进制转换(Q进制转换成T进制) (25分)

给定一个整数Q(2<=Q<=10),一个非空字符串,以及另一个整数T(2<=T<=10), 编程要求过滤掉字符串中所有非Q进制数对应的字符组成一个新的字符串,该字符串无正负号,将该字符串表示的Q进制数转换为T进制数的字符串输出。

输入格式:

第一行输入一个整数Q, 代表Q进制(2<=Q<=10)

第二行输入以回车结束的一行非空字符串。

第三行输入一个整数T, 代表要转换成T进制

输出格式:

输出转换后的T进制数字符串。

输入样例:

1
2
3
10
15
2

输出样例:

1
1111

做题思路:

这题属于比较简单的一类题,进制转换可能是每一个学程序的人都会接触到的内容,所以这里就不再赘述了。唯一需要值得注意的一点是,题目中要求 编程要求过滤掉字符串中所有非Q进制数对应的字符组成一个新的字符串,需要过滤的字符可能不止是字符,也有可能是其他符号(包括空格等),所以读入时需要一行getline,去除字符的时候也应该判断这个字符是否在字符的ASCII码内,不然最后一个测试点很有可能会发生错误。

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int source;
string n;
int target;
cin>>source;
getchar();
getline(cin,n);
cin>>target;
for(auto it=n.begin();it!=n.end();it++){
if(*it-'0'>=source||*it-'0'<0){
n.erase(it);
it--;
}
}
int to_ten=0;
int p=0;
for(auto it=n.rbegin();it!=n.rend();it++){
to_ten+=(*it-'0')*pow(source,p);
p++;
}
if(to_ten==0){
cout<<0<<endl;
return 0;
}
string to_target="";
while(to_ten){
to_target+=(to_ten%target+'0');
to_ten/=target;
}
reverse(to_target.begin(),to_target.end());
cout<<to_target<<endl;
return 0;
}