Openjudge 1.13.1 数制转换:
总时间限制: 1000ms 内存限制: 65536kB
描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。
输入
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。
a,b是十进制整数,2 =< a,b <= 16。
输出
输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F)。
样例输入
15 Aab3 7
样例输出
210306
解题思路
- 将输入的字符串全部转化为大写字母
- 将a进制的数转化为十进制数,用一个long型的整数sum记录
- 将十进制的sum转化为b进制的数,并且将数字的每一位存入一个栈中(方便后续打印结果)
代码1:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
string n;
cin>>a>>n>>b;
//转为大写
for(int i=0;i<n.length();i++){
if(n[i]>='a' && n[i]<='z')
n[i]=n[i]-'a'+'A';
}
//转为十进制;
long long sum=0;
for(int i=0;i<n.length();i++){
if(n[i]>='0' && n[i]<='9'){
sum=sum*a+n[i]-'0';
}
else if(n[i]>='A' && n[i]<='F'){
sum=sum*a+n[i]-'A'+10;
}
}
long long temp=sum;
stack<int> s;
//转为b进制
while(temp){
s.push(temp%b);
temp/=b;
}
int len=s.size();
char re;
for(int i=0;i<len;i++){
if(s.top()>=0 && s.top()<=9)
cout<<s.top();
else{
re=(char)s.top()-10+'A';
cout<<re;
}
s.pop();
}
return 0;
}
问题描述
出现:Wrong Answer 9分
这里我查了好多遍Bug,然后发现是下面这部分的 while应该改成do while循环!! 不然当sum( 或 temp )为0时会直接退出循环。
//转为b进制
while(temp){
s.push(temp%b);
temp/=b;
}
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
string n;
cin>>a>>n>>b;
//转为大写
for(int i=0;i<n.length();i++){
if(n[i]>='a' && n[i]<='z')
n[i]=n[i]-'a'+'A';
}
//转为十进制;
long long sum=0;
for(int i=0;i<n.length();i++){
if(n[i]>='0' && n[i]<='9'){
sum=sum*a+n[i]-'0';
}
else if(n[i]>='A' && n[i]<='F'){
sum=sum*a+n[i]-'A'+10;
}
}
long long temp=sum;
stack<int> s;
//转为b进制
do{
s.push(temp%b);
temp/=b;
}while(temp);
int len=s.size();
char re;
for(int i=0;i<len;i++){
if(s.top()>=0 && s.top()<=9)
cout<<s.top();
else{
re=(char)s.top()-10+'A';
cout<<re;
}
s.pop();
}
return 0;
}