考研算法
题目
题目要求
任意进制间的转换
C++代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
string s;
cin>>s;
if (s=="0")
{
cout<<"0";
}
vector<int> A;
for (int i=s.size()-1;i>=0;i--)
{
if (s[i]>='A' && s[i]<='Z')
{
A.push_back(s[i]-'A'+10);
}
else
{
A.push_back(s[i]-'0');
}
}
string res;
while(A.size())
{
int r=0;
for(int i=A.size()-1;i>=0;i--)
{
A[i]=r*m+A[i];
r=A[i]%n;
A[i]/=n;
}
while(A.size() && A.back()==0)
{
A.pop_back();
}
if (r<10)
{
res+=to_string(r);
}
else
{
res+=r-10+'a';
}
}
reverse(res.begin(),res.end());
cout<<res;
return 0;
}
知识点
ASCII码表
s[i]-'A'+10 /r-10+'a' ASCII码表,A 65,a 97
运算时会将其当做整数
cout<<'Z'-'A';输出25;
string w;
w="test";
w+=10+'a';
cout<<w;
以上输出 k
cout<<(char)(10+'a');
以上输出 k
cout<<(10+'a');
以上输出 107
进制转换
关键代码
while(A.size())
{
int r=0;
for(int i=A.size()-1;i>=0;i--)
{
A[i]=r*m+A[i];
r=A[i]%n;
A[i]/=n;
}
while(A.size() && A.back()==0)//去掉前面的0
{
A.pop_back();
}
if (r<10)
{
res+=to_string(r);
}
else
{
res+=r-10+'a';
}
}
python代码
m,n=map(int,input().split())
A=input()
a=[]
for i in A:
if i>='A':
a.append(int(ord(i)-ord('A')+10))
else:
a.append(int(i))
res=[]
a.reverse()
while (len(a)):
r=0
for i in range(len(a)):
a[len(a)-1-i]=r*m+a[len(a)-1-i]
r=a[len(a)-1-i]%n
a[len(a)-1-i] = int(a[len(a)-1-i]/n)
while ( len(a) and a[-1]==0 ):a.pop()
if r<10:
res.append(r)
else:
res.append(chr(r-10+ord('a')))
res.reverse()
for i in res:
print(i,end='')
知识点
关于range倒叙输出
在这个地方改了好久
for i in range(len(a)-1,-1,-1):
for i in range(len(a)-1,0,-1):
python关于ASCII
Python字符与ASCII码转换 - mrzero - 博客园 (cnblogs.com)
>>>print ord('a')
97
>>>print chr(97)
a