Openjudge 1.13.1 数制转换

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

解题思路

  1. 将输入的字符串全部转化为大写字母
  2. 将a进制的数转化为十进制数,用一个long型的整数sum记录
  3. 将十进制的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;
}


猜你喜欢

转载自blog.csdn.net/m0_57099194/article/details/130079538