当前位置:编程学习 > C/C++ >>

数制转换 (九度oj题目44)

题目
[html]  
题目描述:  
    求任意两个不同进制非负整数的转换(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  
提示:  
可以用字符串表示不同进制的整数。  
 
 
思路
这道题是一道数制转化问题,考察不同进制间转换的算法。不同进制间的转换,可以以十进制为中介
R进制转换为十进制:乘以权值求和法
十进制转换为R进制:除以基数取余法,用顺序栈作为数据结构辅助
这道题注意前导0的问题,因此不能因为a == b,就直接将字符串输出,必须进行转换
 
AC代码
[cpp]  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
#define MAX 200  
  
struct stack  
{  
    char data[MAX];  
    int top;  
};  
  
long int switchToTen(int a, char *s);  
  
int main()  
{  
    long int a, b, n;  
    char str[MAX];  
  
    while(scanf("%ld %s %ld", &a, str, &b) != EOF)  
    {  
        n = switchToTen(a, str);  
        if(n == 0)  
        {  
            printf("0");  
        }else  
        {  
            int temp;  
            struct stack *s = (struct stack *)malloc(sizeof(struct stack));  
            s->top = 0;  
  
            while(n)  
            {  
                temp = n % b;  
                if(temp >= 0 && temp <= 9)  
                {  
                    s->data[s->top ++] = temp + '0';  
                }else  
                {  
                    s->data[s->top ++] = temp - 10 + 'A';  
                }  
                n /= b;  
            }  
  
            while(s->top)  
            {  
                printf("%c", s->data[-- s->top]);  
            }  
        }  
        printf("\n");  
    }  
  
    return 0;  
}  
  
  
long int switchToTen(int a, char *s)  
{  
    int i, b;  
    long int n, c;  
  
    for(n = 0, c = 1, i = strlen(s) - 1; i >= 0; i --)  
    {  
        if(s[i] >= 'A' && s[i] <= 'Z')  
            b = s[i] - 55;  
        else if(s[i] >= 'a' && s[i] <= 'z')  
            b = s[i] - 87;  
        else  
            b = s[i] - '0';  
        n += b * c;  
        c *= a;  
    }     
  
    return n;  
}  
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,