理一下思路:
看了y总的视频之后我觉得这道题其实只需要对上次写的进制转换微微做一下调整即可。
于是我写出了下面的代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
vector<int> Change(vector<int> num,int m,int n){
vector<int> C;
int r = 0;
for(int i=num.size()-1;i>=0;i--){
//现将现在需要除的数加上上一位余下的数
r = r * m + num[i];
//现在将余数塞入数组。
C.push_back(r/n);
r = r%n;
}
reverse(C.begin(),C.end());
while(!C.empty() && C.back()==0) C.pop_back();
return C;
}
int main(){
int n,m;
cin>>m>>n;
string number;
cin>>number;
vector<int> num;
int vn = number.size();
for(int i=0;i<vn;i++){
num.push_back(number[vn-1-i] - '0');
}
string str;
while(!num.empty()){
str += to_string(num[0]%n);
num = Change(num,m,n);
}
reverse(str.begin(),str.end());
cout<<str;
return 0;
}
提交之后,发现除了y总写在题面上的样例我是一个测试样例都没过。
而且我发现题面的测试样例还就是10进制转二进制那。所以我就耐着性子继续看下去。
发现我少考虑了3点
1.十进制转比10进制小的进制在这道题里是极为特殊的情况 而且没有特判
因为如果是上述的情况 我们就可以这样做,因为作为十进制的最后一位%比10小的进制的结果其实就是整个十进制数%比10小的进制的结果。所以可以这样,但是其他情况如十进制转十二进制就不是这么一会事了。
while(!num.empty()){
str += to_string(num[0]%n);
num = Change(num,m,n);
}
应该改为下面的代码 ,r为每次做完一次除法的余数,所以每次出来的除数就可以直接作为答案的一部分入栈
if(number == "0") str ="0";
else{
while(!num.empty()){
r = Change(num,m,n);
if(r<10)str += to_string(r);
else str += r-10+'a';
}
}
2. 在将字符串转为数字数组的过程中,我没有考虑到10以上的进制的特殊处理
for(int i=0;i<vn;i++){
num.push_back(number[vn-1-i] - '0');
}
应将上述代码改为:
for(int i=0;i<vn;i++){
char a = number[vn - 1 -i];
if(a>='A') num.push_back(a - 'A' +10);
else num.push_back(a - '0');
}
3. 这里不是我的错误,应该算是我的知识盲区
大于十进制的转为十进制
if(a>='A') num.push_back(a - 'A' +10);
十进制转为大于十进制的
else str += r-10+'a';
整体代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int Change(vector<int> &num,int m,int n){
vector<int> C;
int r = 0;
for(int i=num.size()-1;i>=0;i--){
//现将现在需要除的数加上上一位余下的数
r = r * m + num[i];
//现在将余数塞入数组。
C.push_back(r/n);
r = r%n;
}
reverse(C.begin(),C.end());
// for(int i=0;i<C.size();i++) cout<<C[i];
// cout<<endl;
while(!C.empty() && C.back()==0) C.pop_back();
num = C;
return r;
}
int main(){
int n,m;
cin>>m>>n;
string number;
cin>>number;
vector<int> num;
int vn = number.size();
for(int i=0;i<vn;i++){
//2 ----------------------
char a = number[vn - 1 -i];
if(a>='A') num.push_back(a - 'A' +10);
else num.push_back(a - '0');
}
string str;
int r;
if(number == "0") str ="0";
else{
// 1------------------
while(!num.empty()){
r = Change(num,m,n);
if(r<10)str += to_string(r);
else str += r-10+'a';
}
}
reverse(str.begin(),str.end());
cout<<str;
return 0;
}