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

题目1130: 数制转换

题目描述
求任意两个不同进制非负整数的转换(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)。
 
 
 
 
样例输入
4 123 10 
 
样例输出
27 
 
提示 [+]
*** 提示已隐藏,点击上方 [+] 可显示 ***
 
 
 
来源
2008年北京大学图形实验室计算机研究生机试真题
 
 
 
【思路】 
 
 
\
 
 
 
 
 
 
 
[cpp] 
/********************************* 
*   日期:2013-2-19 
*   作者:SJF0115 
*   题号: 天勤OJ 题目1130: 数制转换 
*   来源:http://acmclub.com/problem.php?id=1130 
*   结果:AC 
*   来源:2008年北京大学图形实验室计算机研究生机试真题 
*   总结: 
**********************************/  
#include <string.h>   
#include <stdio.h>   
  
char str[1001];  
char ans[1001];  
/* 
* 转换为十进制 
*  str是a进制数字 
*/  
long long int ToD(int a){  
    int c,len,i;  
    long long int sum,w;  
    len = strlen(str);  
    //转换为十进制的数字   
    sum = 0;  
    //权值   
    w = 1;  
    //从低位到高位遍历每一个数字   
     for(i = len-1;i >= 0;i--){  
         //0 - 9   
        if(str[i] >= '0' && str[i] <= '9'){  
            c = str[i] - '0';  
        }  
        //A - F   
        else if(str[i] >= 'A' && str[i] <= 'F'){  
            c = str[i] - 'A' + 10;  
        }  
        //a - f   
        else{  
            c = str[i] - 'a' + 10;  
        }  
        //累加该位数字和该位数字的权值的积   
        sum  +=  c * w;  
        //进制权值   
        w *= a;  
     }  
    return sum;  
}  
/* 
* 十进制数字num转换为b进制数字,并用ans存储 
*/  
int ToAny(long long int num,int b){  
    int index = 0,c;  
    do{  
        //计算该位数字   
        c = num % b;  
        //将数字转换为字符   
        ans[index++] = (c < 10) ? (c + '0') : (c - 10 + 'A') ;  
        num /= b;  
    }while(num);  
    return index;  
}  
int main()  
{  
    long long int c;  
    int len,a,b,i;  
    while(scanf("%d %s %d",&a,str,&b) != EOF){  
        //转换为十进制   
        c = ToD(a);  
        //转换为b进制   
        len = ToAny(c,b);  
        //输出   
        for(i = len-1;i >= 0;i--){  
            printf("%c",ans[i]);  
        }  
        printf("\n");  
    }  
    return 0;  
}  
 
/*********************************
*   日期:2013-2-19
*   作者:SJF0115
*   题号: 天勤OJ 题目1130: 数制转换
*   来源:http://acmclub.com/problem.php?id=1130
*   结果:AC
*   来源:2008年北京大学图形实验室计算机研究生机试真题
*   总结:
**********************************/
#include <string.h>
#include <stdio.h>
 
char str[1001];
char ans[1001];
/*
* 转换为十进制
*  str是a进制数字
*/
long long int ToD(int a){
    int c,len,i;
    long long int sum,w;
    len = strlen(str);
    //转换为十进制的数字
    sum = 0;
    //权值
    w = 1;
    //从低位到高位遍历每一个数字
     for(i = len-1;i >= 0;i--){
         //0 - 9
        if(str[i] >= '0' && str[i] <= '9'){
            c = str[i] - '0';
        }
//A - F
        else if(str[i] >= 'A' && str[i] <= 'F'){
            c = str[i] - 'A' + 10;
        }
//a - f
        else{
            c = str[i] - 'a' + 10;
        }
//累加该位数字和该位数字的权值的积
        sum  +=  c * w;
//进制权值
        w *= a;
     }
    return sum;
}
/*
* 十进制数字num转换为b进制数字,并用ans存储
*/
int ToAny(long long int num,int b){
    int index = 0,c;
    do{
        //计算该位数字
        c = num % b;
<
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,